将屏幕保存为图片。使用vs2008编译通过。

  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <atlimage.h>
  4. int __stdcall WinMain(
  5. HINSTANCE hInstance,
  6. HINSTANCE hPrevInstance,
  7. LPSTR lpCmdLine,
  8. int nShowCmd)
  9. {
  10. HWND hwnd = ::GetDesktopWindow();
  11. HDC hDC = ::GetDC(hwnd);//获取屏幕DC
  12. RECT rect;
  13. ::GetClientRect(hwnd, &rect);//获取屏幕大小
  14. HDC hDCMem = ::CreateCompatibleDC(hDC);//创建兼容DC
  15. HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);//创建兼容位图
  16. HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);//将位图选入DC。并保存返回值
  17. ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//将屏幕DC的图象拷贝到内存DC中
  18. CImage image;
  19. image.Attach(hBitMap);
  20. image.Save(_T("c://B.jpg"));//假设文件后缀为.bmp,则保存为为bmp格式
  21. image.Detach();
  22. ::SelectObject(hDCMem, hOldMap);//选入上次的返回值
  23. //释放
  24. ::DeleteObject(hBitMap);
  25. ::DeleteDC(hDCMem);
  26. ::DeleteDC(hDC);
  27. return 0;
  28. }

将当前MFC程序(这里是单文档程序)保存为图片。使用vs2005。

第一个使用CImage类保存图片。第二个使用BITMAPINFO。

第一个:

  1. void CMainFrame::OnGetMap()
  2. {
  3. HWND hwnd = this->GetSafeHwnd();
  4. HDC hDC = ::GetWindowDC(hwnd);//获取DC
  5. RECT rect;
  6. ::GetWindowRect(hwnd, &rect);//获取屏幕大小
  7. HDC hDCMem = ::CreateCompatibleDC(hDC);//创建兼容DC
  8. HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right-rect.left, rect.bottom-rect.top);//创建兼容位图
  9. HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);//将位图选入DC,并保存返回值
  10. ::BitBlt(hDCMem, 0, 0, rect.right-rect.left, rect.bottom-rect.top, hDC, 0, 0, SRCCOPY);//将屏幕DC的图象拷贝到内存DC中
  11. CImage image;//须要#include <atlimage.h>
  12. image.Attach(hBitMap);
  13. image.Save(_T("c://B.jpg"));//假设文件后缀为.bmp,则保存为为bmp格式
  14. image.Detach();
  15. ::SelectObject(hDCMem, hOldMap);//选入上次的返回值
  16. //释放
  17. ::DeleteObject(hBitMap);
  18. ::DeleteDC(hDCMem);
  19. ::DeleteDC(hDC);
  20. }

第二个:

  1. void CMainFrame::OnGetMap()
  2. {
  3. CDC* pDC = GetWindowDC();
  4. CBitmap bitmap;
  5. CDC memDC ;
  6. CRect rect;
  7. GetWindowRect(rect);
  8. memDC.CreateCompatibleDC(pDC);
  9. bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
  10. memDC.SelectObject(&bitmap);
  11. memDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
  12. CFileDialog fDlg(FALSE,_T("bmp"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("位图文件|*.bmp"),this);
  13. if (fDlg.DoModal()==IDOK)
  14. {
  15. CString bmpfile = fDlg.GetPathName();
  16. CFile file(bmpfile,CFile::modeCreate|CFile::modeWrite);
  17. BITMAP bInfo;
  18. bitmap.GetBitmap(&bInfo);
  19. //计算调色板大小
  20. int panelsize = 0;
  21. if (bInfo.bmBitsPixel<24) //非真彩色
  22. {
  23. panelsize = pow((double)2,bInfo.bmBitsPixel)*sizeof(RGBQUAD);
  24. }
  25. //定义位图信息
  26. BITMAPINFO*  bMapInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
  27. bMapInfo->bmiHeader.biBitCount = bInfo.bmBitsPixel;
  28. bMapInfo->bmiHeader.biClrImportant = 0;
  29. bMapInfo->bmiHeader.biCompression = 0;
  30. bMapInfo->bmiHeader.biHeight = bInfo.bmHeight;
  31. bMapInfo->bmiHeader.biPlanes = bInfo.bmPlanes;
  32. bMapInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
  33. bMapInfo->bmiHeader.biSizeImage = bInfo.bmHeight*bInfo.bmWidthBytes;
  34. bMapInfo->bmiHeader.biWidth = bInfo.bmWidth;
  35. bMapInfo->bmiHeader.biXPelsPerMeter = 0;
  36. bMapInfo->bmiHeader.biYPelsPerMeter = 0;
  37. //获取位图的实际数据
  38. char* pData = new char[bMapInfo->bmiHeader.biSizeImage];
  39. int len = GetDIBits(pDC->m_hDC,bitmap,0,bInfo.bmHeight,pData,bMapInfo,DIB_RGB_COLORS);
  40. BITMAPFILEHEADER bFileHeader;
  41. bFileHeader.bfType = 0x4D42;
  42. bFileHeader.bfReserved1 = 0;
  43. bFileHeader.bfReserved2 = 0;
  44. bFileHeader.bfSize = sizeof(BITMAPFILEHEADER);
  45. bFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+panelsize;
  46. //向文件里写入位图数据
  47. file.Write(&bFileHeader,sizeof(BITMAPFILEHEADER));
  48. file.Write(&bMapInfo->bmiHeader,sizeof(BITMAPINFOHEADER));
  49. file.Write(pData,bMapInfo->bmiHeader.biSizeImage+panelsize);
  50. file.Close();
  51. delete pData;
  52. LocalFree(bMapInfo);
  53. }
  54. bitmap.DeleteObject();
  55. memDC.DeleteDC();
  56. }

版权声明:本文博主原创文章,博客,未经同意,不得转载。

保存画面为图片 当前MFC保存该程序为图片 c++ vc的更多相关文章

  1. python 从视频中提取图片,并保存在硬盘上

    使用python的moviepy库来提取视频中的图片,按照视频每帧一个图片的方式来保存. extract images from video, than save them to disk from ...

  2. h5页面转图片长按保存

    5页面经常会遇到此类需求.将最后的结果页转换为图片长按保存.下面介绍一下实现此需求的过程 1,依赖安装 cnpm install html2canvas --save 2,依赖引入,使用 绑定 初始化 ...

  3. C# winform 窗体应用程序之图片上传Oracle数据库保存字段BLOB

    C# winform 窗体应用程序之图片上传Oracle数据库保存字段BLOB 我用的数据库是Oracle,就目前来看,许多数据库现在都倾向于Oracle数据库,对ORACLE数据库基本的操作也是必须 ...

  4. SpringMVC上传文件(图片)并保存到本地

    SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...

  5. html 移动端关于长按图片弹出保存问题

    在做html5项目的时候有个需求是要拖动一个图片,但是又不要用户长时间按着弹出保存框.首先想到的就是在点图片的时候阻止默认事件的发生: js停止冒泡· function myfn(e){ window ...

  6. 7. 进行图片的数据补全和增强(随机亮度,随机饱和度,随机翻转) Image.open(进行图片的读入) 2.ImageEnhance.Brightness(亮度变化) 3.ImageEnhance.Contrast(饱和度变化) 4.enhance_image.transpose(图片随机翻转) 5.enhance_image.save(进行图片保存)

    1.Image.open(image_path)  进行图片的打开 参数说明:image_path 表示图片的路径 2. ImageEnhance.Brightness(image)  # 进行图片的 ...

  7. 生成二维码,并且保存,指定位置的view成图片,并且保存到本地相册

    效果图: 保存的图片效果是: 保存到本地的,是整个视图,不只是单单的二维码的图片, 在了解的一番过程之后,我知道了, 1.首先要去获取保存图片的写入权限:(使用 https://github.com/ ...

  8. PHP抓取远程图片到本地保存(如何把错误信息用text文件写入)

    最近在工作中需要开发了一个用户素材功能,里面需要将网上的各种图片素材进行本地化存储.于是在网上找了一些相关资料,并根据自身开发需要,整理了一下主要的逻辑代码. /** * PHP将网页上的图片攫取到本 ...

  9. 什么是Nib文件?(Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口)

    Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口.Nib文件是Interface Builder文档.通常您会使用Interface Builder ...

随机推荐

  1. 关于心理的二十五种倾向(查理&#183;芒格)-3

    9)回馈倾向人们早就发现.和猿类,猴类,狗类等其它很多认知能力较为低下的物种同样,人类身上也有以德报德,以牙还牙的极端倾向:这样的倾向明显能够促进有利于成员利益的团体合作.这跟非常多社会性的动物的基因 ...

  2. 安装Win10+Ubuntu14.04双系统(uefi启动版)

    说明 本教程基于个人电脑(型号:神舟K550d-i7 D1)成功安装测试发布,不同硬件环境可能有细微差异,为预防安装过程中出现意想不到的报错,重要数据请提前备份 硬件环境 cpu:Intel i7-4 ...

  3. [D3] Create Labels from Non-numeric Data with Ordinal Scales in D3 v4

    When your data contains discrete, non-numeric property values that you need to format or convert bef ...

  4. 怎样实现iMessage群发

    怎样实现iMessage群发 Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用.完美替代运营商的短信与电话.并且FaceTime与iMessage ...

  5. java.sql.SQLException:Column count doesn&#39;t match value count at row 1

    1.错误描写叙述 java.sql.SQLException:Column count doesn't match value count at row 1 2.错误原因     在插入数据时,插入的 ...

  6. Java中a=a+b 与 a+=b差别

    一般觉得a=a+b的运行效率是低于a+=b的,由于它多进行了一步中间变量的操作,并且会多占用一个变量的空间.而Java编译器默认对其进行了优化,优化之后两条语句都当做 a+=b来运行了,所以实际上是没 ...

  7. Erlang 进制转换

    http://www.cnblogs.com/me-sa/archive/2012/03/20/erlang0047.html bnot unary bitwise not integer div i ...

  8. 微信小程序从零开始开发步骤(二)

    上一章注册完小程序,添加新建的项目,大致的准备开发已经完成,本章要分享的是要创建一个简单的页面了,创建小程序页面的具体几个步骤: 1. 在pages 中添加一个目录 选中page,右击鼠标,从硬盘打开 ...

  9. unresolved external symbol __forceAtlDllManifest错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 晚上编译一个ATL程序,出现一些诡异的错误: 1>CGreet.obj : error LNK2001: unr ...

  10. mysqlbinlog命令使用

    常用参数:--start-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取.datetime值相对于运行mysqlbinlog的机器上的本地 ...