




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用VC进行屏幕截取编程潘小龙 顾时明屏幕截取是令人比较感兴趣的事情.虽然现在有不少应用程序如HYPERSNAP等可以用来截取你所喜欢的屏幕画面,但是如果能把这个功能加到自己的程序中,就更能利用它强大的作用. 下面用VC来逐步介绍在Windows95下的实现过程.首先我们要确定屏幕截取的区域,用LPRECT结构来定义.可以截取一个窗口,或整个屏幕.以下代码把选定的屏幕区域拷贝到位图中.HBITMAP CopyScreenToBitmap(LPRECT 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 xScrn) nX2 = xScrn; if (nY2 yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; / 创建一个与屏幕设备描述表兼容的位图hBitmap = CreateCompatibleBitmap (hScrDC, nWidth, nHeight); / 把新位图选到内存设备描述表中 hOldBitmap = SelectObject(hMemDC, hBitmap); / 把屏幕设备描述表拷贝到内存设备描述表中BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); /得到屏幕位图的句柄 hBitmap = SelectObject(hMemDC, hOldBitmap); /清除 DeleteDC(hScrDC); DeleteDC(hMemDC); / 返回位图句柄 return hBitmap; 得到屏幕位图句柄以后,我们可以把屏幕内容粘贴到剪贴板上. if (OpenClipboard(hWnd) /hWnd为程序窗口句柄 /清空剪贴板 EmptyClipboard(); /把屏幕内容粘贴到剪贴板上, hBitmap 为刚才的屏幕位图句柄 SetClipboardData(CF_BITMAP, hBitmap); /关闭剪贴板 CloseClipboard(); 我们也可以把屏幕内容以位图格式存到磁盘文件上. int SaveBitmapToFile(HBITMAP hBitmap , LPSTR lpFileName) /hBitmap 为刚才的屏幕位图句柄 /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,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; /计算调色板大小 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 ; /为位图内容分配内存 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, hPal, FALSE); RealizePalette(hDC); / 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFOHEADER *) 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; / BMdwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; / 写入位图文件头WriteFil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鹰潭市中储粮2025秋招笔试行测高频题库及答案
- 防城港市中储粮2025秋招笔试题库含答案
- 小学语文1-6年级“根据偏旁写汉字”15个集锦
- 中国广电龙岩市2025秋招计算机类专业追问清单及参考回答
- 中国移动邵阳市2025秋招半结构化面试模拟30问及答案
- 中国联通安徽地区2025秋招笔试模拟题及答案
- 自媒体创业测试题及答案
- 2025年手工黏土考试题及答案
- 淮南市中石化2025秋招笔试英语专练题库及答案
- 天津市中石化2025秋招面试半结构化模拟题及答案机械与动力工程岗
- 真空包装机作业指导书
- 质子泵抑制剂临床使用管理办法
- 2023年上海16区高考一模英语听力合集附音频含答案含原文
- 中医医院处方笺模板
- GB/T 4170-2006塑料注射模零件技术条件
- GB/T 12363-2021锻件功能分类
- 水调歌头-公开课教学设计 省赛一等奖
- 《番茄工作法图解》课件
- 报价单模板及范文(通用十二篇)
- 蒂森克虏伯电梯MC2-C调试介绍
- 苏教版三年级数学上册《间隔排列》作业纸(大组教研)
评论
0/150
提交评论