屏幕保存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();