## 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截图 保存和显示相关推荐

  1. 【Flutter 问题系列第 22 篇】在 Flutter 中如何截取屏幕并显示到页面中,以及如何将截图保存到相册

    这是[Flutter 问题系列第 22 篇],如果觉得有用的话,欢迎关注专栏. 关于在 Flutter 中如何截取屏幕,以及如何将截图保存到相册的文章少之又少,即使有,也是错误一大片,有的甚至运行后都 ...

  2. QT编写实现图片的幻灯片播放、自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、重置、显示鼠标位置像素坐标及RGB值、播放GIF动画、截图保存、批量保存、拖入文件夹遍历所有文件

    这个图片查看器功能很多,是我花了不少心思,不断优化,不断添加功能的成果: 1.能打开并显示所有常用图片格式文件,显示鼠标位置像素坐标及RGB值 2.能缩放,拖动图片,可以以鼠标为中心滚动滚轮进行缩放 ...

  3. C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片

    本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...

  4. VC++ MFC 多线程及线程同步(详细、全面总结!)

    更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC    多线程及线程同步                          ...

  5. 窗口置顶(置于桌面所有程序之上)VC/MFC 怎么将窗口置顶

    软件界面全屏显示后,需要把窗体置于其他桌面程序之上,但总是置于其他弹出框之下,会造成用户忽略了导致用户不明什么原因. 百度查了好多方法总是失败. 后来查到了CSND的一个帖子http://bbs.cs ...

  6. VC/MFC QA 200407

    CSDN 讨论总结系列: Jiangsheng的CSDN Digest (Dec 2005)(http://blog.csdn.net/jiangsheng/archive/2005/12/24/56 ...

  7. VC++ MFC DLL动态链接库编写详解

    虽然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建.本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们. 一.DLL的不同类型 使用VC++可以生成 ...

  8. VC/MFC中常用宏的含义

    VC/MFC中常用宏的含义 Visual C++ MFC 中常用宏的含义(转载)     AND_CATCHAND_CATCH AND_CATCH(exception_class,exception ...

  9. DbgView软件 查看VC++ MFC 程序的打印信息

    DbgView软件 查看VC++ MFC 程序的打印信息 一.在写VC++ MFC程序的调制过程中,需要跟踪打印信息,但在MFC中用printf不知道在哪里看打印信息,今天介绍一款软件,可以查看对应的 ...

最新文章

  1. 前端控制器html,DispatcherServlet(前端控制器)访问顺序和url匹配规则
  2. c++ map利用迭代器赋值
  3. block学习(一)
  4. linux系统修改时区开发板,Linux系统时区时间修改
  5. java listen_Java进阶-IO基础
  6. GNN 模型在生物化学和医疗健康中的典型应用
  7. Python 爬虫工具 —— fake_useragent
  8. Java设计模式-工厂模式
  9. 升级macos beta_如何选择退出macOS开发人员或公开Beta版
  10. 安司密信服务器维护,安司密信好用吗?安司密信使用教程[多图]
  11. Android把文字写到图片上生成图片+文字的新图片
  12. 五分钟带你了解面向对象的四大基本特征
  13. surface电脑分辨率问题/字体太小
  14. 微信小程序和ssm交互
  15. openGauss杭州用户组正式成立啦
  16. Linux及操作系统介绍
  17. 从零开始学python数据分析与挖掘
  18. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
  19. android购票日历,人生日历抢票软件使用教程:人生日历抢票成功技巧
  20. 《动手学深度学习》手动导入数据集产生错误的解决方法

热门文章

  1. hybris学习笔记:New Extension
  2. linux(ubuntu16.04)系统下Matlab2015b软件下载与安装
  3. 无锡设计类——平面设计培训班学费一般多少?
  4. 赖春林Python初学笔记 Day0.1
  5. samba服务日志文件
  6. IOS Iphone震动 和 提示音
  7. 酒店没有使用计算机管理的现状,浅谈酒店管理信息化应用.doc
  8. Deepin V20安装
  9. 计算机论文致谢词范文500字,专科论文致谢词范文500字(通用8篇)
  10. 一个为了梦想的it游侠