有的時候,我們可能會需要將對話框的整個客戶區存儲為圖片的格式,下面介紹了一種將客戶區保存為BMP圖片的方法。主要步驟如下:
⑴?獲取當前客戶區
⑵?設置位圖格式及內容
⑶?存儲數據為BMP圖片
下面結合實例來說明(**完整實例請到我的CSDN資源中下載:[http://download.csdn.net/detail/margin1988/3677115](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"));

效果圖
- 前言
- VC++中自定義熱鍵及響應
- CFileDialog文件對話框
- VC++中客戶區保存為BMP圖片
- VC++讀、寫注冊表
- VC++播放音頻文件和音頻數據的方法
- VC++調用Matlab編寫的DLL(混合編程)
- VC++中文件讀、寫和其他相關操作匯總
- VC++獲取系統當前時間
- VC++按鈕控件字體設置
- VC++軟件界面風格簡單美化
- VC++中一些常用的數據類型之間的相互轉化
- VC++中截取字符串的方法
- VC++中vector矢量的使用方法及隨機相關
- VC++中結構體的定義及使用
- VC++中List Control控件的使用方法介紹
- VC++中窗口過程函數及其消息發送、響應機制介紹
- VC++中Ribbon編程架構及SDI架構多視圖切換介紹
- 串口通信基礎知識及VC++實現
- VC++中單個鍵盤按鍵的響應
- VC++中的計時器及多媒體高精度計時器
- VC++編寫DLL導出函數及其調用方法
- VC++對話框(CDialog)的全屏顯示及控件居中顯示
- VC++對話框(CDialog)添加背景圖片
- VC++圖片控件(Picture Control)顯示資源位圖(BMP)、文件位圖(BMP)、其它格式文件圖片(JPG\PNG\BMP)的方法
- VC++對Access數據庫的操作(查詢、插入、更新、刪除等)