屏幕保存bmp图像,经常出错,高手给指点迷津

jiaqt 2008-05-14 03:52:18
如题,想保存一个窗口图像到bmp,从网上参考别人一段,但执行起来,经常出错,检查发现可能是DC没有释放,加上后,还是异常,请高手指点一下,感谢~!~!

CDC *pDC;
CRect rect;
CStatic *pCurve=(CStatic *)GetDlgItem(IDC_STATIC_CURVE);//保存曲线的窗口
if(pCurve==NULL) return;
pCurve->GetClientRect(&rect);
pDC=(CDC *)pCurve->GetDC();

CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
//dc.CreateCompatibleDC(pDC);

//rect.bottom+=15; //调整图像
//rect.right+=15;
CBitmap bm;
bm.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height()); //定义bmp图像的宽阔,高
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
//tdc.BitBlt(0,0,rect.Width(),rect.Height(),&dc,rect.left,rect.top,SRCCOPY);
tdc.BitBlt(0,0,rect.Width(),rect.Height(),&dc,10,50,SRCCOPY);
tdc.SelectObject(pOld);

BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
//LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
LPSTR lpData=(LPSTR)GlobalAlloc(GPTR,size);

BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;

CString strFilter = "BMP Files (*.bmp)|*.bmp|";
CString m_wszFileName;//=m_FileName.Left(m_FileName.GetLength()-4)+".bmp";//"CopyScreen.bmp";
CFileDialog dlgSave(FALSE, ".bmp", m_wszFileName, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter);
if (dlgSave.DoModal() == IDCANCEL)
return ;
m_wszFileName = dlgSave.GetPathName();
CFile bf;
if(bf.Open(m_wszFileName,CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
}
GlobalFree(lpData);

//****************原来到这里后面,我加上了释放DC,但还是异常****************************
//pDC->DeleteDC();
pCurve->ReleaseDC(pDC);
dc.DeleteDC();
tdc.DeleteDC();
...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2008-05-16
  • 打赏
  • 举报
回复
dc.CreateDC("DISPLAY",NULL,NULL,NULL);是用于拷贝屏幕的,你已经获取了控件的DC,这个就不需要了,把控件的DC作为BitBlt的源DC就可以了。
后面再加一句bm.DeleteObject()看看。
量子 2008-05-16
  • 打赏
  • 举报
回复
我这里用这段代码没问题
jiaqt 2008-05-14
  • 打赏
  • 举报
回复
出错位置,就在最后函数结尾的大括号处。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧