//获取当前屏幕的并且保存图片
LRESULT CFeetScanView::SaveViewBMP(WPARAM wParam, LPARAM lParam)
{
CRect rect;
this->GetClientRect(&rect);
rect.left = ;
rect.top = ;
CBitmap m_bitmap;
m_bitmap.m_hObject = CopyScreenToBitmap(rect); char szFileName[_MAX_PATH];
char szPath[_MAX_PATH];
GetConfigMgr()->GetModuleDirectory( szPath);
sprintf( szFileName, "%s\\image.png", szPath);
SaveBitmapToFile(m_bitmap,szFileName);
return ;
} HBITMAP CFeetScanView::CopyScreenToBitmap(LPRECT lpRect)
{
// 屏幕和内存设备描述表
HDC hScrDC=, hMemDC;
// 位图句柄
HBITMAP hBitmap, hOldBitmap;
// 选定区域坐标
int nX, nY, nX2, nY2;
// 位图宽度和高度
int nWidth, nHeight;
// 屏幕分辨率
int xScrn, yScrn;
// 确保选定区域不为空矩形
// if (IsRectEmpty(lpRect))
// return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC( "DISPLAY", NULL, NULL, NULL);
//
int ok=;
if(hScrDC==NULL) //如果创建失败
{
ok=;
}
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect-> left;
nY = lpRect-> top;
nX2 = lpRect-> right;
nY2 = lpRect-> bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX <)
nX = ;
if (nY < )
nY = ;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY; // 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, , , nWidth, nHeight,hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄
hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除
DeleteDC(hScrDC);
DeleteDC(hMemDC); // 返回位图句柄
return hBitmap;
} BOOL CFeetScanView::SaveBitmapToFile(HBITMAP hBitmap, LPCTSTR lpFileName )
{
HDC hDC; //设备描述表
int iBits; //当前显示分辨率下每个像素所占字节数
WORD wBitCount; //位图中每个像素所占字节数
DWORD dwPaletteSize=, //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap; //位图属性结构
BITMAPFILEHEADER bmfHdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 HANDLE fh, hDib, hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数
HDC hWndDC = CreateDC("DISPLAY",NULL,NULL,NULL);
hDC = ::CreateCompatibleDC( hWndDC ) ;
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC); if (iBits <= )
wBitCount = ;
else if (iBits <= )
wBitCount = ;
else if (iBits <= )
wBitCount = ;
else if (iBits <= )
wBitCount = ;
else
wBitCount = ; //计算调色板大小
if (wBitCount <= )
dwPaletteSize = ( << wBitCount) * sizeof(RGBQUAD); //设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = ;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = ;
bi.biXPelsPerMeter = ;
bi.biYPelsPerMeter = ;
bi.biClrUsed = ;
bi.biClrImportant = ; dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+)/) * * 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, , (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize,
(LPBITMAPINFO )
lpbi, DIB_RGB_COLORS); //恢复调色板
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
} //创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE,
, 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 = ;
bmfHdr.bfReserved2 = ;
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; } //将当前的图片进行90度显示出来
CDC* pDC1 = m_left_pic.GetDC();
Graphics graph(pDC1->GetSafeHdc());
CRect rect;
m_left_pic.GetClientRect(rect); char szFileName[_MAX_PATH];
char szPath[_MAX_PATH];
GetConfigMgr()->GetModuleDirectory( szPath);
sprintf( szFileName, "%s\\image.png", szPath);
WCHAR wszWideString[_MAX_PATH];
wcscpy(wszWideString, CT2CW(szFileName));
Image image(wszWideString); REAL width = (REAL)image.GetWidth();
REAL height = (REAL)image.GetHeight();
int nX = ;
int nY = ;
Point point90[] = {
Point(nX + height,nY),
Point(nX + height,nY+width),
Point(nX,nY)
}; graph.DrawImage(&image, point90,);
ReleaseDC(pDC1);

MFC 屏幕截图方法的更多相关文章

  1. VS2017未安装MFC解决方法

    VS2017未安装MFC解决方法 https://blog.csdn.net/u010921682/article/details/89847395

  2. Linux强大屏幕截图方法,理论能截取任何图形界面,包括登录界面

    众所周知,屏幕截图可以使用“Print Screen”按键,但是,此按键的响应是靠系统的后台服务实现的,Linux在某些场景下,是不响应此按键的. 这里介绍一种更强大的截图方法,它是靠转储X图形环境的 ...

  3. MFC 调试方法

    AfxDebugBreak     MFC 提供特殊的 AfxDebugBreak 函数,以供在源代码中对断点进行硬编码:     AfxDebugBreak( ); 在 Intel 平台上,AfxD ...

  4. VC/MFC 进程间通信方法总结

    摘   要   随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程 / 多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的. M ...

  5. MFC 屏幕截图(libjpeg bmp转jpg)

    项目中需要用到的功能. void Screenshot() { CDC *pDC; pDC = CDC::FromHandle(GetDC(GetDesktopWindow())); if(pDC = ...

  6. MFC坐标转换

    1.GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置. 2.GetClientRect取得窗口客户区(不 ...

  7. C++第四十三篇 -- VS2017创建控制台程序勾选MFC类库

    用VS2017创建EXE带MFC类库方法 1. File --> New --> Project 2. Windows桌面向导 3. 勾选MFC类库 4. 创建成功 如果项目编译出错 1. ...

  8. MonoGame 3.2 下,截屏与 Texture2D 的保存

    10月20日注:后来发现了这篇博文(英文),XNA 中的 Color 实际上是与 Alpha 值自左乘(premultiplied)的,这也解释了直接用 0xARGB 转译而颜色异常的原因. 注意,由 ...

  9. Selenium生成Report的利器- ExtentReports

    生成的报告最后的样子是: 里面加了截图, 将每一步骤的截图,(所以方法里多加了一个截屏方法). 加入到报告中,这样更清晰明了.首先 pom文件中需引用:<!-- 报告输出 --><d ...

随机推荐

  1. cordova 下载更新

    function UpdateForAndroid(downloadUrl) { $ionicLoading.show({ template: "已经下载:0%" }); var ...

  2. HTTP历程

    原文http://www.ruanyifeng.com/blog/2016/08/http.html 1.HTTP/0.9 HTTP是基于TCP/IP协议的应用层协议.它不涉及数据包传输,主要规定了客 ...

  3. icon-font与svg

    icon font 使用与svg应用分享 icon font 字体概述 css3增加了@font-face属性,传统的浏览器是通过font-family来设置字体,如果系统里没有的话就用其它字体来代替 ...

  4. Joomla

    joomla Joomla实际有两个开源的东西: 1.Joomla内容管理系统即JoomlaCMS(Content Management System, CMS).它是网站的一个基础管理平台.几乎适合 ...

  5. JAVA求集合中的组合

    好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...

  6. Linux 批量修改文件名

    背景:在研究MP4解码播放的时候音视频字幕的分片命名不符合规范,分片个数太多只能脚本实现. 解决问题类型: 1.将Garfield1HD_261_dan-*.m4s 统一转换为Garfield1HD_ ...

  7. CALayer 4 详解 -----转自李明杰

    CALayer4-自定义层   本文目录 一.自定义层的方法1 二.自定义层的方法2 三.其他 自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下. 回到顶部 一.自定义层的方法1 方法描 ...

  8. PHP文件的读取

    1.PHP部分文件操作函数 ( fopen ,fread ,filesize,fwrite,fclose ) 2.unlink()  rmdir() 删除函数 unlink(路径和文件名): rmdi ...

  9. Hibernate+Oracle注解式完整实例

    MyEclipse10,新建Web Project,取名hibernate, jar包 1.Cat.java (实体类) package com.hibernate.bean; import java ...

  10. NodeJs使用asyncAwait两法

    async/await使用同步的方式来书写异步代码,将异步调用的难度降低到接近于0,未来必将大放异彩.然而在当下,由于标准化的缓存步伐,async/await尚在ES7的草案中.为了尝先,特试用了下面 ...