ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:304.73KB ,
资源ID:15820943      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15820943.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(如何抓图Word下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

如何抓图Word下载.docx

1、 THandle;pt:TPoint;fBitmap:TBitmap;begin hCur := GetCursor(); / 获得光标句柄 GetCursorPos(pt); / 记录光标位置 winHWND := GetDesktopWindow();winDC := GetDC(winHWND);GetWindowRect(winHWND, rect);fBitmap := TBitmap.create;fBitmap.width := rect.right-rect.left;fBitmap.height := rect.bottom-rect.top;BitBlt(fBitmap.c

2、anvas.handle, 0, 0, fBitmap.width, fBitmap.height, winDC, 0, 0, SRCCOPY);DrawIcon(fBitmap.canvas.handle, pt.x, pt.y, hCur); / 画光标 ReleaseDC(winHWND, winDC);fBitmap.SaveToClipBoardFormat(AFormat,AData,APalette);Clipboard.SetAsHandle(AFormat,AData);end;当你在Form上点一下,程序将截取屏幕图像,并将图像拷贝至剪贴板。2GDI和GDI+屏幕抓图的实现

3、一、 简介屏幕抓图程序在处理图形中应用广泛。作为Windows XP及以后版本操作系统的图形处理内核,GDI+在二维几何图形处理、图像显示与转换和字符排版等方面简直是传统GDI程序员的一种解脱。但是,至少在目前情况下,GDI+尚不能完全代替GDI。与GDI相比,它至少还存在以下不足:不支持从内存到屏幕的位传输操作;不支持光栅“位运算”操作;如果程序性能、速度要求比较严格,在图片输出方面的表现较差时,GDI往往能取代实现高性能的输出。本文通过对流行的屏幕抓图程序工作原理的剖析,力图向读者阐明GDI+与GDI各自在图形处理方面的优缺点,并给出相应的VC+ .NET代码实现。 二、 GDI在抓图中的

4、关键作用 要实现屏幕抓图,关键有两点:一是获取图片所在窗口的窗口句柄,即在何处捕获图片;二是保存抓取的图片,实现这一点正是GDI+的强项。 对于问题一,可以利用SetCapture函数,它能够追踪鼠标指针的移动(包括在屏幕抓图程序窗口之外的窗口)。在移动鼠标的过程中,它还可以根据鼠标的指针所在位置来判断当前窗口的窗口句柄。我们还可以使用函数WindowFromPoint,这个函数能够找出鼠标指针当前位置所对应的窗口句柄。 使用过知名的抓图软件SnagIT的读者都知道,在选择抓图窗口时,鼠标指针所在位置的窗口都会出现加粗的红色边框,以提醒目前所选择的窗口,这个功能实现起来有些复杂。下面介绍在GD

5、I中如何使这个红色边框出现。 【注意】正是由于这个红色边框的实现,读者才能发现GDI+在这方面的弱点。在GDI中,一个最基本的概念就是设备环境(DC),每一个窗口都具有自己的DC。如果能够找到窗口的DC,那么,用户就能够在该窗口的任何位置绘图。然而,在屏幕抓图程序中,由于用户所选择的窗口不固定,所以,要想得到鼠标指针所处窗口的DC并不容易。这一问题的答案在于GetDC函数。下面是GetDC的函数声明:HDC GetDC(HWND hWnd); 这里,hWnd是DC对应的窗口句柄。注意,当hWnd为空时,该函数返回的是整个屏幕的设备环境句柄。这就意味着,开发人员可以在屏幕上的任何位置进行任意的绘

6、图操作。 在鼠标指针所处的窗口绘图时,绘图的目的只是为了提醒用户目前所选择的窗口,所以,在绘图时,必须保证不会破坏窗口原有的画面。这时可将窗口的绘图模式设为RS_NOTXORPEN,将画笔颜色与屏幕颜色进行异或运算之后,再对屏幕颜色取反即可。RS_NOTXORPEN运算方式的特点在于:对同一像素进行两次RS_NOTXORPEN运算后,像素值并不会发生变化。这样,在同一个地方进行两次绘图后,窗口的画面并不会发生任何变化。 【注意】这些功能在GDI+中很难实现。 三、 编码实现由上可知,屏幕抓图至少分为3个步骤: (1) 启用鼠标指针捕获。 (2) 在鼠标指针所在处的窗口进行绘图,提示抓图的目标。

7、 (3) 选定目标窗口时,将目标窗口的画面保存为自定义的位图并终止鼠标指针捕获。 以下是具体的编程步骤: (1)在Visual C+ .NET中按照GDI+程序的框架新建一个基于对话框的项目ScreenCapture,然后准备好一个外形为相机的光标文件(*.cur),将之引入资源管理器(IDC_CAMERA)。接着在CScreenCaptureDlg类中加入以下两个全局变量:HWND hwndCapture;Crect rectCapture; (2)通过类向导加入对WMMOUSEMOVE及WMLBUTTONUP事件的响应函数,分别如下所示。void CScreenCaptureDlg:OnM

8、ouseMove(UINT nFlags, CPoint point)/如果用户按隹鼠标左键不放,则开始抓取图片if(nFlags=MK_LBUTTON)/隐藏程序窗口,以免影响在抓取时的“视野”ShowWindow(SW_HIDE);/载入“照相机”鼠标指针,开始追踪鼠标指针的移动HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CAMERA);SetCursor(cur);SetCapture();/获得鼠标指针所在窗口的句柄this-ClientToScreen(&point);hwndCapture=(H

9、WND):WindowFromPoint(point);/取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图HDC hDC=:GetDC(NULL);/建立一个红色的画笔HPEN hPen=CreatePen(PS_INSIDEFRAME,6,RGB(255,0,0);/将绘图模式设为R2_NOTXORPEN,在绘图时可以不破坏原有的背景int nMode=SetROP2(hDC,R2_NOTXORPEN);HPEN hpenOld=(HPEN)SelectObject(hDC,hPen);/得到鼠标指针所在窗口的区域GetWindowRect(hwndCapture,&rectCapture)

10、;/在鼠标指针所在处的窗口四周画一红色的矩形,做为选定时的提示POINT pt5;pt0=CPoint(rectCapture.left,rectCapture.top);pt1=CPoint(rectCapture.right,rectCapture.top);pt2=CPoint(rectCapture.right,rectCapture.bottom);pt3=CPoint(rectCapture.left,rectCapture.bottom);pt4=CPoint(rectCapture.left,rectCapture.top);Polyline(hDC,pt,5);/延时后再重绘

11、红色矩形,这样不会破坏原有的内容Sleep(100);SelectObject(hDC,hpenOld);ReleaseDC(NULL,hDC);CDialog:OnMouseMove(nFlags, point);OnLButtonUp(UINT nFlags, CPoint point)/ 得到鼠标指针所在窗口的区域宽、高int nWidth=rectCapture.Width();int nHeight=rectCapture.Height();HDC hdcScreen,hMemDC;HBITMAP hBitmap,hOldBitmap;/建立一个屏幕设备环境句柄hdcScreen=C

12、reateDC(DISPLAY,NULL,NULL,NULL);hMemDC=CreateCompatibleDC(hdcScreen);/建立一个与屏幕设备环境句柄兼容、与鼠标指针所在窗口的区域等大的位图hBitmap=CreateCompatibleBitmap(hdcScreen,nWidth,nHeight);/把新位图选到内存设备描述表中hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);/把屏幕设备描述表拷贝到内存设备描述表中BitBlt(hMemDC,0,0,nWidth,nHeight,hdcScreen,rectCapture.l

13、eft,rectCapture.top,SRCCOPY);DeleteDC(hdcScreen);DeleteDC(hMemDC);/返回位图句柄/打开剪贴板,并将位图拷到剪贴板上OpenClipboard();EmptyClipboard();SetClipboardData(CF_BITMAP,hBitmap);/关闭剪贴板CloseClipboard();MessageBox(屏幕内容已经拷到剪贴板!);ReleaseCapture();/恢复窗口显示模式ShowWindow(SW_NORMAL);OnLButtonUp(nFlags, point); 至此,一个具有专业效果的屏幕抓图程序的核心已经搞定。 四、 用GDI+实现画面的保存 经过上面两步,如果用户在对话框中按住鼠标左键不放,程序便开始“抓图”。当选择好抓图的目标后,松开鼠标左键,抓图的目标窗口的画面就自动保存到剪贴板中了。但是,把画面保存到文件中更为重要。如果用GDI的方式来操作,需要对各种类位图的结构有详尽的了解,极其麻烦。但如果用GDI+来实现之则极为容易。下面介绍如何将已经抓到的图片保存到一个BMP文件中。由上面知,抓图程序已经得到了所捕获的窗口的位图句柄,接下来要将位图句柄保存为相应的位图文件。这一切归功于GDI+的Bitmap类,详见下列代码。/省略if(GetSaveFileName(&of

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1