抓图软件课程设计屏幕截图软件设计.doc
《抓图软件课程设计屏幕截图软件设计.doc》由会员分享,可在线阅读,更多相关《抓图软件课程设计屏幕截图软件设计.doc(10页珍藏版)》请在三一办公上搜索。
1、屏幕截图软件设计杨金(西北农林科技大学信息工程学学院计算机科学与技术2002级3班 陕西杨凌 712100 )摘要: 本文阐述 VC+实现屏幕截图功能的原理和具体设计步骤,所实现的这个抓图软件可以截取整个屏幕,截取指定的窗口,并将截取到的图像以bmp文件形式保存到指定的路径下。技术重点在鼠标在屏幕上的准确定位;如何获取抓图的窗口句柄;如何对抓到的图片进行保存的问题。技术难点在如何将所抓取的屏幕窗口保存为磁盘BMP文件形式。关键词:屏幕截图;BMP位图;设备环境(DC)1 引言在我们的日常上网活动当中比如看电影、玩游戏、做图等等会对一些画面特别喜欢!但是却没有办法将这些画面以图片形式保存下来,真
2、是犹如“水中月,镜中花”看得到却得不到。由于QQ的出现,曾改变了几亿人的交流生活方式,它的里面嵌入的任意截图功能,更是为人们的生活增添了无限的欢愉和快乐,通过截图自己可以将最喜欢的游戏画面,最喜欢的电影画面,以图片形式保存,可以及时的发给好友共享,给我们带来了意想不到的帮助和惊喜。另外系统的功能强大的截图软件在社会建设的各个领域都到了施展空间,为人们的工作生活创造了极大的方便,解决了许多棘手难题。可以说呀抓图软件有很广阔的应用前景,虽然它不算是很庞大的系统软件,但是其它的大型的主流系统软件能够嵌入抓图的功能,必将受到极大的欢迎和青睐。所以在此次软件课程设计当中,我选择了用VC制作屏幕截图的软件
3、,实现截取指定窗口,整个屏幕的功能,并且将截取的图形以BMP文件形式存放在指定路径的磁盘当中。本文将系统介绍截图软件的设计原理,设计步骤,设计方法,和运用的重点技术。2 实现基本原理和运用相关技术抓图软件基本原理就是把屏幕上所抓取的图像复制到内存中,并最后将内存中的图像内容以位图文件形式保存到磁盘当中。在这此软件设计当中,如果用户将鼠标左键按住不放,则开始抓取图片,此时隐藏程序窗口,以免影响在抓取时的“视野”,接着装入“魔法棒”鼠标,开始追踪鼠标的移动,然后获得鼠标所在处的窗口句柄,取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图。接下来建立一红色的画笔,得到鼠标所在处的窗口的区域,在鼠标所在
4、处的窗口四周画一红色的矩形,做为选定时的提醒。当鼠标左键释放的时候得到鼠标所在处的窗口的区域宽、高,然后建立一个屏幕设备环境句柄和与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图,把新位图选到内存设备描述表中,最后把屏幕设备描述表拷贝到内存设备描述表中,终止鼠标捕获,恢复窗口显示模式。那么最后要作的工作就是写一个位图保存函数将内存当中的窗口图片信息以位图形式保存到指定磁盘当中。在整个程序当中要用到大量的函数:比如申请内存空间用于存放位图文件 GlobalAlloc(GHND,FileLength); 位图文件读入所申请内存空间中LoadFileToMemory( mpBitsSrc,
5、mFileName); 在OnPaint等函数中用创建显示用位图;用CreateDIBitmap()创建显示用位图;用CreateCompatibleDC()创建兼容DC, 用SelectBitmap()选择显示位图; 用BitBlt或StretchBlt等函数显示位图 ; 用DeleteObject()删除所创建的位图;程序中还会用到许多关键函数在这里不在详细叙述,其功能用法可以参照MSDN。屏幕抓图程序的关键有两点:一是应该知道鼠标在屏幕上有准确位置;二是应该知道欲抓图的窗口句柄;三是如何对抓到的图片进行保存的问题。对于问题一,很简单,利用SetCapture函数便能够追踪鼠标的移动(包括
6、在屏幕抓图程序窗口之外的窗口)。对于问题二,这时会用到一个平时我们不常用的函数:WindowFromPoint,其函数用法如下:HWND WindowFromPoint POINT Point; /坐标;这个函数能够找出鼠标当前位置所对应的窗口句柄。具体用法可以参见MSDN,这里不做详细叙述。在选择抓图窗口时,鼠标的在位置的窗口都会出现加粗的有色边框,以提醒目前所选择的窗口,这个功能实现起来有些复杂,它的代码如下:POINT pt5; pt0 = CPoint(rectCapture.left, rectCapture.top); pt1 = CPoint(rectCapture.right,
7、rectCapture.top); pt2 = CPoint(rectCapture.right,rectCapture.bottom); pt3 = CPoint(rectCapture.left, rectCapture.bottom); pt4 = CPoint(rectCapture.left, rectCapture.top);在GDI中,最常见的一个概念就设备环境(DC),每一个窗口都相应的具有自己的DC。如果能够调用到窗口的DC,那么,我们便能够在窗口上的任何位置绘图。然而,在屏幕抓图程序中,由于用户所选择的窗口是不固定的,所以,要想得到鼠标所在处的窗口的DC,不是很容易。但是能
8、够随心所欲地在屏幕上进行绘图却又不仅限于特定的窗口,GetDC能够做到这点! GetDC的函数申明:HDC GetDC( HWND hWnd),hWnd是DC对应的窗口句柄,当hWnd为空时,该函数返回的是整个屏幕的设备环境句柄!这就意味着我们可以在屏幕上进行任意绘图。在鼠标所在处的窗口进行绘图时,绘图本身的目的只是为了提醒用户目前所选择的窗口,所以,在进行绘图时,必须得保证不会破坏窗口原有的画面。这点很好办,将窗口的DC绘图模式设为R2_NOTXORPEN(将画笔颜色与屏幕颜色进行异或后,再将屏幕颜取反),这样,在同一个地方进行两次绘图后(对同一像素进行两次异或运算,像素值并不会发生变化),
9、窗口的画面并不会发生任何变化。以上就是此次截图软件设计当中运用的相关技术和设计实现原理。3 软件详细设计31建立基于对话框的工程文件启动Visual C+,生成一个基于对话框的工程,工程名为“Capture”. 然后准备好一个外形为细长矩形的光标文件(*.cur),将之引入资源管理器(IDC_CAMERA)。接着在CCaptureDlg类中加入两个全局变量:HWND hwndCapture; CRect rectCapture; UINT nFlags;CPoint point;LPCTSTR lpFileName;HBITMAP hBitmap;32添加消息响应函数然后通过类向导加入对WM_
10、MOUSEMOVE及WM_LBUTTONUP事件的响应函数,添加WM_MOUSEMOVE事件的响应函数代码该函数主要实现的功能:鼠标左键按住不放,则开始抓取图片,此时隐藏程序窗口,以免影响在抓取时的“视野”,接着装入“魔法棒”鼠标,开始追踪鼠标的移动,然后获得鼠标所在处的窗口句柄,取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图。接下来建立一红色的画笔,得到鼠标所在处的窗口的区域,在鼠标所在处的窗口四周画一红色的矩形,做为选定时的提醒。void CCaptureDlg:OnMouseMove(UINT nFlags, CPoint point) /如果用户将鼠标左键按住不放,则开始抓取图片 i
11、f(nFlags=MK_LBUTTON) /隐藏程序窗口,以免影响在抓取时的“视野” ShowWindow(SW_HIDE); /装入“魔法棒”鼠标,开始追踪鼠标的移动 HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CAMERA ); SetCursor(cur); SetCapture(); /获得鼠标所在处的窗口句柄 ClientToScreen(&point); hwndCapture=(HWND):WindowFromPoint(point); /取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图 HD
12、C 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); /在鼠标所在处的窗口四周画一红色的矩形,做为选定时的提醒 POINT pt5;
13、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); /延时后再重绘红色的矩形,这样就不会破坏原有内容 Sle
14、ep(100); :Polyline(hDC,pt,5); :SelectObject(hDC,hpenOld); :ReleaseDC(NULL,hDC); CDialog:OnMouseMove(nFlags, point);添加WM_LBUTTONUP事件的响应函数代码:该函数主要实现当鼠标左键释放的时候得到鼠标所在处的窗口的区域宽、高,然后建立一个屏幕设备环境句柄和与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图,把新位图选到内存设备描述表中,最后把屏幕设备描述表拷贝到内存设备描述表中,终止鼠标捕获,恢复窗口显示模式。void CCaptureDlg:OnLButtonUp(
15、UINT nFlags, CPoint point) /得到鼠标所在处的窗口的区域宽、高 int nWidth=rectCapture.Width(); int nHeight=rectCapture.Height(); HDC hdcScreen, hMemDC; HBITMAP hOldBitmap; /建立一个屏幕设备环境句柄 hdcScreen = CreateDC(DISPLAY, NULL, NULL, NULL); hMemDC = CreateCompatibleDC(hdcScreen); /建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图 hBitmap
16、= CreateCompatibleBitmap(hdcScreen, nWidth, nHeight); / 把新位图选到内存设备描述表中 hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap); / 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC,0,0,nWidth,nHeight,hdcScreen,rectCapture.left,rectCapture.top,SRCCOPY); /取回鼠标所在处的窗口屏幕位图的句柄 hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 课程设计 屏幕 截图 软件设计
链接地址:https://www.31ppt.com/p-2884864.html