牛骨文教育服务平台(让学习变的简单)

VC++中客户区保存为BMP图片

有的时候,我们可能会需要将对话框的整个客户区存储为图片的格式,下面介绍了一种将客户区保存为BMP图片的方法。主要步骤如下:

⑴ 获取当前客户区

⑵ 设置位图格式及内容

⑶ 存储数据为BMP图片

下面结合实例来说明(完整实例请到我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/3677115):

#include "WINDOWSX.H "

//获取客户区及设置位图格式、内容
CClientDC   SHDC(this);
CDC   memDC; 
CRect   rect; 
GetClientRect(rect); 
memDC.CreateCompatibleDC(&SHDC); 
CBitmap   bm; 
int   Width   =   rect.Width();
int   Height   =   rect.Height();
bm.CreateCompatibleBitmap(&SHDC,Width,Height); 
CBitmap*     pOld   =   memDC.SelectObject(&bm); 
memDC.BitBlt(0,0,Width,Height,&SHDC,0,0,SRCCOPY); 
memDC.SelectObject(pOld); 
BITMAP     btm; 
bm.GetBitmap(&btm); 
DWORD     size   =   btm.bmWidthBytes*btm.bmHeight; 
LPSTR   lpData   =(LPSTR)GlobalAllocPtr(GPTR,size); 
BITMAPFILEHEADER       bfh; 
bfh.bfReserved1   =   bfh.bfReserved2   =   0; 
bfh.bfType   =   ((WORD)( "M"<<8)|"B"); 
bfh.bfSize   =   54   +   size; 
bfh.bfOffBits   =   54; 
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(GetDC()->GetSafeHdc(),bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); 
//CFileDialog弹出保存文件窗口及保存文件
CFileDialog  dlg(FALSE,_T(""),_T(""),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp")); 
CString str;
str.Format("%sBMP",g_BasePath);
dlg.m_ofn.lpstrInitialDir=_T(str);
if(dlg.DoModal()==IDOK) 
{
	CFile     bf; 
	CString   ss=dlg.GetPathName(); 
	if(bf.Open(ss,CFile::modeCreate|CFile::modeWrite)) 
	{ 
		bf.Write(&bfh,sizeof(BITMAPFILEHEADER)); 
		bf.Write(&bih,sizeof(BITMAPINFOHEADER)); 
		bf.Write(lpData,size); 
		bf.Close(); 
	} 
	GlobalFreePtr(lpData);
}

※值得注意的是,这段程序中有另外一个小知识点,那就是“另存为”文件对话框:

CFileDialog  dlg(FALSE,_T(""),_T(""),OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T(".bmp|.bmp"));

效果图