有的时候,我们可能会需要将对话框的整个客户区存储为图片的格式,下面介绍了一种将客户区保存为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"));
![](https://box.kancloud.cn/2016-08-31_57c6b4a39f6a6.gif)
效果图
- 前言
- 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数据库的操作(查询、插入、更新、删除等)