void CSaveScreanDlg::OnBnClickedsavebmp()
{
CRectTracker m_rectTracker;
CBitmap m_bSaveBitmap,bmp2;
CClientDC dc(this);
m_rectTracker.m_rect = CRect(0,0,800,800);
CRect re(m_rectTracker.m_rect);
m_bSaveBitmap.CreateCompatibleBitmap(&dc,re.Width(),re.Height());
CDC tempDc;
tempDc.CreateCompatibleDC(&dc);
tempDc.SelectObject(&m_bSaveBitmap);
tempDc.BitBlt(0,0,re.Width(),re.Height(),&dc,re.left,re.top,SRCCOPY);
//弹出一个对话框,保存为bmp格式
CFileDialog fDlg(FALSE,_T("bmp"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp"),this);
if (fDlg.DoModal()==IDOK)
{
CString bmpfile = fDlg.GetPathName();
//用CImage保存图片
ATL::CImage img;
img.Attach(m_bSaveBitmap);
img.Save(bmpfile);
img.Detach();
//将结构体bm,转为char*,赋值给bm2;用来测试socket传送;
BITMAP bm;
m_bSaveBitmap.GetBitmap(&bm);
char *bmchar=(char*)&bm;
BITMAP bm2;
memcpy_s(&bm2,sizeof(BITMAP)+1,bmchar,sizeof(BITMAP));
long size=bm2.bmHeight*bm2.bmWidth*bm2.bmBitsPixel/8;
//把CBitbmp数据存为char*格式用于socket传送;
BYTE *pbuf=new BYTE[size];
//ZeroMemory(pbuf,size);
memset(pbuf,0,size);
m_bSaveBitmap.GetBitmapBits(size,pbuf);
客户端可以将bm2,pbuf重组为bmp;
CDC *pdc=GetDC();
bmp2.CreateCompatibleBitmap(pdc,bm2.bmWidth,bm2.bmHeight);
bmp2.SetBitmapBits(size,pbuf);
//在控件上显示出来;
CStatic *p=(CStatic*)GetDlgItem(IDC_STATIC);
p->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE);
p->SetBitmap(bmp2);
//截图后退出程序
// PostQuitMessage(0);
}
}
void CSaveScreanDlg::OnBnClickedButton2()
{
CDC* pScreenDc = CDC::FromHandle(::GetDC(NULL));//<span style="white-space:pre"> </span>//屏幕DC
CDC memDc;//<span style="white-space:pre"> </span>// 内存DC
CBitmap memBmp;
CBitmap* pOldBmp;
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
memDc.CreateCompatibleDC(pScreenDc);
memBmp.CreateCompatibleBitmap(pScreenDc, cx, cy);
pOldBmp = memDc.SelectObject(&memBmp);
memDc.BitBlt(0, 0, cx, cy, pScreenDc, 0, 0, SRCCOPY);
//保存图片
ATL::CImage img;
img.Attach(memBmp);
img.Save("d:\\12.bmp");
img.Detach();
//复制到剪切板
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP, memBmp.Detach());
CloseClipboard();
// 显示到当前界面
CClientDC clientDc(this);
CRect rcClient;
GetClientRect(rcClient);
clientDc.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDc, 0, 0, cx, cy, SRCCOPY);
memDc.SelectObject(pOldBmp);
memDc.DeleteDC();
memBmp.DeleteObject();
}