vc++/mfc截图 保存和显示
## 1. 实现截图程序的api接口 ##
HBITMAP CaptureScreen(LPRECT lpRect)//lpRect为NULL时表示全屏幕截图
{HDC hdc, hdcMem ;HBITMAP hemfCopy ;HWND hwndScr ;int dstcx, dstcy ;if(lpRect){dstcx = lpRect->right - lpRect->left ;dstcy = lpRect->bottom - lpRect->top ;}else{dstcx = GetSystemMetrics(SM_CXSCREEN) ;dstcy = GetSystemMetrics(SM_CYSCREEN) ;}if (LockWindowUpdate(hwndScr = GetDesktopWindow ())){hdc = GetDCEx (hwndScr, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE) ;hdcMem = CreateCompatibleDC (hdc) ;if(NULL==hdcMem){ReleaseDC (hwndScr, hdc) ;LockWindowUpdate (NULL) ;return NULL;}hemfCopy = CreateCompatibleBitmap (hdc, abs(dstcx), abs(dstcy)) ;if(NULL==hemfCopy){DeleteDC (hdcMem) ;ReleaseDC (hwndScr, hdc) ;LockWindowUpdate (NULL) ;return NULL;}SelectObject (hdcMem, hemfCopy) ;if(lpRect)StretchBlt (hdcMem, 0, 0, abs(dstcx), abs(dstcy), hdc, lpRect->left, lpRect->top, dstcx, dstcy, SRCCOPY|CAPTUREBLT) ;elseBitBlt (hdcMem, 0, 0, dstcx, dstcy, hdc, 0, 0, SRCCOPY|CAPTUREBLT) ;DeleteDC (hdcMem) ;ReleaseDC (hwndScr, hdc) ;LockWindowUpdate (NULL) ;return hemfCopy;}return NULL;
}
``
2、保存图片
BOOL SaveBmp(HBITMAP hBitmap,CString FileName)
{ HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal,hOldPal=NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC(TEXT("DISPLAY"),NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if(iBits <= 1) wBitCount = 1; else if(iBits <= 4) wBitCount = 4; else if(iBits <= 8) wBitCount = 8; else wBitCount = 24; GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); bi.biSize= sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression= BI_RGB; bi.biSizeImage=0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 0; dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight; //为位图内容分配内存 hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight, (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return TRUE;
}
3、在dialog中 显示
在onPaint中显示 ,其中mfc设计到 BITMAP hbitmap和cbitmap之间的关系
在mfc程序中,使用cbitmap
CPaintDC dc(this);CDC dcimage;CBitmap bkg;bkg.Attach(g_bitmap);BITMAP bkginfo;bkg.GetBitmap(&bkginfo);//获取位图信息dcimage.CreateCompatibleDC(&dc);dcimage.SelectObject(&bkg);// dc.BitBlt(0,0,nWidth,nHeight,&dcimage,0,0,SRCCOPY);dc.StretchBlt(0,0,nWidth,nHeight,&dcimage,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
`
vc++/mfc截图 保存和显示相关推荐
- 【Flutter 问题系列第 22 篇】在 Flutter 中如何截取屏幕并显示到页面中,以及如何将截图保存到相册
这是[Flutter 问题系列第 22 篇],如果觉得有用的话,欢迎关注专栏. 关于在 Flutter 中如何截取屏幕,以及如何将截图保存到相册的文章少之又少,即使有,也是错误一大片,有的甚至运行后都 ...
- QT编写实现图片的幻灯片播放、自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、重置、显示鼠标位置像素坐标及RGB值、播放GIF动画、截图保存、批量保存、拖入文件夹遍历所有文件
这个图片查看器功能很多,是我花了不少心思,不断优化,不断添加功能的成果: 1.能打开并显示所有常用图片格式文件,显示鼠标位置像素坐标及RGB值 2.能缩放,拖动图片,可以以鼠标为中心滚动滚轮进行缩放 ...
- C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片
本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...
- VC++ MFC 多线程及线程同步(详细、全面总结!)
更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC 多线程及线程同步 ...
- 窗口置顶(置于桌面所有程序之上)VC/MFC 怎么将窗口置顶
软件界面全屏显示后,需要把窗体置于其他桌面程序之上,但总是置于其他弹出框之下,会造成用户忽略了导致用户不明什么原因. 百度查了好多方法总是失败. 后来查到了CSND的一个帖子http://bbs.cs ...
- VC/MFC QA 200407
CSDN 讨论总结系列: Jiangsheng的CSDN Digest (Dec 2005)(http://blog.csdn.net/jiangsheng/archive/2005/12/24/56 ...
- VC++ MFC DLL动态链接库编写详解
虽然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建.本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们. 一.DLL的不同类型 使用VC++可以生成 ...
- VC/MFC中常用宏的含义
VC/MFC中常用宏的含义 Visual C++ MFC 中常用宏的含义(转载) AND_CATCHAND_CATCH AND_CATCH(exception_class,exception ...
- DbgView软件 查看VC++ MFC 程序的打印信息
DbgView软件 查看VC++ MFC 程序的打印信息 一.在写VC++ MFC程序的调制过程中,需要跟踪打印信息,但在MFC中用printf不知道在哪里看打印信息,今天介绍一款软件,可以查看对应的 ...
最新文章
- 前端控制器html,DispatcherServlet(前端控制器)访问顺序和url匹配规则
- c++ map利用迭代器赋值
- block学习(一)
- linux系统修改时区开发板,Linux系统时区时间修改
- java listen_Java进阶-IO基础
- GNN 模型在生物化学和医疗健康中的典型应用
- Python 爬虫工具 —— fake_useragent
- Java设计模式-工厂模式
- 升级macos beta_如何选择退出macOS开发人员或公开Beta版
- 安司密信服务器维护,安司密信好用吗?安司密信使用教程[多图]
- Android把文字写到图片上生成图片+文字的新图片
- 五分钟带你了解面向对象的四大基本特征
- surface电脑分辨率问题/字体太小
- 微信小程序和ssm交互
- openGauss杭州用户组正式成立啦
- Linux及操作系统介绍
- 从零开始学python数据分析与挖掘
- 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
- android购票日历,人生日历抢票软件使用教程:人生日历抢票成功技巧
- 《动手学深度学习》手动导入数据集产生错误的解决方法