HBITMAP CLoadpicDlg::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); 
 //为屏幕设备描述表创建兼容的内存设备描述表 
 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 < 0) 
  nX = 0; 
 if (nY < 0) 
  nY = 0; 
 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,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY); 
 //得到屏幕位图的句柄 
  hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); 
 //清除 
  DeleteDC(hScrDC); 
     DeleteDC(hMemDC); 
 // 返回位图句柄 
  return hBitmap;

}

int CLoadpicDlg::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
//lpFileName 为位图文件名 
HDC hDC; 
 //设备描述表 
int iBits; 
//当前显示分辨率下每个像素所占字节数 
WORD wBitCount; 
 //位图中每个像素所占字节数 
//定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数 
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten; 
BITMAP Bitmap; 
//位图属性结构 
BITMAPFILEHEADER bmfHdr; 
//位图文件头结构 
BITMAPINFOHEADER bi; 
//位图信息头结构 
LPBITMAPINFOHEADER lpbi; 
//指向位图信息头结构 
HANDLE fh, hDib, hPal; 
HPALETTE hOldPal=NULL; 
//定义文件,分配内存句柄,调色板句柄 
 
//计算位图文件每个像素所占字节数 
hDC = CreateDC("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 if (iBits <= 24) 
wBitCount = 24; 
else 
wBitCount = 32; 
//计算调色板大小 
if (wBitCount <= 8) 
dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD); 
 
//设置位图信息头结构 
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.biClrUsed = 0; 
bi.biClrImportant = 0; 
 
dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight; 
//为位图内容分配内存 
/*xxxxxxxx计算位图大小分解一下(解释一下上面的语句)xxxxxxxxxxxxxxxxxxxx
//每个扫描行所占的字节数应该为4的整数倍,具体算法为:
1int biWidth = (Bitmap.bmWidth*wBitCount) / 32;
if((Bitmap.bmWidth*wBitCount) % 32)
 biWidth++; //不是整数倍的加1
biWidth *= 4;//到这里,计算得到的为每个扫描行的字节数。
dwBmBitsSize = biWidth * Bitmap.bmHeight;//得到大小
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ 
 
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, hOldPal, TRUE); 
RealizePalette(hDC); 
::ReleaseDC(NULL, hDC); 

//创建位图文件 
fh=CreateFile(lpFileName, 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, sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize , &dwWritten, NULL); 
//清除 
GlobalUnlock(hDib); 
GlobalFree(hDib); 
CloseHandle(fh); 
return TRUE;
}

void CLoadpicDlg::OnButton1()
{
 CRect rect; 
// GetWindowRect(&rect); 
    GetDlgItem(IDC_TEMPLATE)->GetWindowRect(&rect);
 HBITMAP hMap = CopyScreenToBitmap(rect); 
 SaveBitmapToFile(hMap,"C://seu07201213(汪洋中的一片叶子).bmp");

}

注:在原出处后我改了一下,我要获取是的图片控件中的图,原文言出外为:http://blog.163.com/wei_zhiwei/blog/static/130369656201241151229973/

VC屏幕截图(将屏幕指定区域存成图片)相关推荐

  1. 【python】python实现屏幕指定区域文字提取(百度API)

    因为OCR文字识别功能不是特别好,推荐利用百度API的来实现屏幕指定区域的文字识别. 一.如何注册百度API? 1.打开百度api网页,使用百度账号登陆 2.点击控制台,选择文字识别 3.点击创建应用 ...

  2. VC++屏幕捕获并保存成图片(附源码)

    目录 1.屏幕捕获(截取桌面) 2.将内存中的位图保存成图片文件 3.完整功能的屏幕截图

  3. HTML表格无法保存图片,怎样将EXCLE表格或HTML保存为图片形式? | excle怎么存成图片的格式...

    怎样把图片中的表格转化到Excel 如何将EXCEL表格保存为图片(任何格式) 不能直接保存成图片,建议存成pdf 然后直接截图保存就行 个人偶尔会这么做,或者有时候页面不大的话,会直接qq截图保存 ...

  4. iOS 截图 对view指定区域 以及 对图片 指定区域截图

    //MARK:获取截图,对view 制定区域截图static func getCropImage(_ view:UIView,size:CGSize) -> UIImage {//false是透 ...

  5. flutter手写画板,保存存成图片并上传到后台服务器

    1.只是一个dome,供借鉴使用,待优化 图例: 2. 这个手写画板借鉴了很多的github上面的内容,基本就是用github上的内容拼凑出来的,随后我会把github上相关的链接写上去 3. 全部代 ...

  6. 截取屏幕指定区域保存为BMP文件

    HBITMAP CopyScreenToBitmap(LPRECT lpRect) { //屏幕和内存设备描述表 HDC hSrcDC, hMemDC; //位图句柄 HBITMAP hBitmap, ...

  7. 吭吭唧唧写shader--实现一个模型在屏幕指定区域的渲染

    功能:实现一个模型在指定屏幕坐标中的渲染,不在的裁剪掉 效果: GroudX和GroudY都为0时: 调整数值后: 原理,得到模型在屏幕中的坐标传入片面着色器时,判断下顶点坐标是否在指定区域内,不在的 ...

  8. java截取屏幕指定范围内的图片并识别图片内的文字

    目录 目标 概述 代码 根据坐标截图 截图效果 识别图片上的文字 相关依赖与工具类 识别效果 目标 根据给定的坐标,在屏幕上截图并保存到指定的目录下: 识别图片中的文字. 概述 利用JDK自带的方法实 ...

  9. php如何把网页存成图片格式,php怎么生成图片 网页快照?

    php怎么生成图片 网页快照? Fatal error: Call to undefined function curl_init() in E:PHPwap.cjcp.cnsrcphpinfo.ph ...

最新文章

  1. bootstrap之div居中
  2. android studio 优化提速方法,Android Studio速度慢(如何加速)?
  3. linux上查看gitlab日志,如何查看Gitlab的版本?
  4. twisted.internet.error.TimeoutError错误的解决方法
  5. OSSIM主要数据库表结构
  6. 知物由学 | 干货!一文了解安卓APP逆向分析与保护机制
  7. Python机器学习:梯度下降法003线性回归中的梯度下降法
  8. automaticallyAdjustsScrollViewInsets 标签栏不正常显示
  9. TIOBE 9 月编程语言:C++ 突起、Java 流行度下降
  10. csgo跳投绑定指令_csgo控制台指令大全
  11. OAuth2认证授权流程解析
  12. 大数据为你解读2017年全国出差地图
  13. C语言ip地址转换成十六进制,将IP地址转换为十六进制
  14. ionic4自定义插件
  15. 群发邮件软件怎么发,教你邮箱群发邮件小技巧
  16. 文件系统错误(-1073740791)解决办法
  17. 最新!「大象机器人」即将推出双臂人形机器人,智能机器人时代可期!
  18. 学一点Wi-Fi: CCMP
  19. Linux:syscall: entry_SYSCALL_64_after_hwframe
  20. 小苹果活动助手1.27最新版电脑版

热门文章

  1. 非常好用的Unity测试工具
  2. 右键万能格式转换工具
  3. 新华字典api 根据汉字拼音查询相关信息
  4. 【电力系统】基于粒子群算法求解热电联产系统优化配置问题附matlab代码
  5. 数据库质疑和可疑是一样的吗_是时候质疑带回家的测试了
  6. DMA (串口DMA发送接收)
  7. 平安科技亮相重庆,「AI人脸识别+健康医疗」首秀
  8. EMCC13.4 手动安装Linux Agent
  9. Emscripten 编译器(emcc) 命令总结
  10. 脉歌蓝牙耳机线评测_Macaw脉歌 TX-80 蓝牙运动耳机 个人小评测