资源描述:
《用VC进行屏幕截取编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用VC进行屏幕截取编程潘小龙顾时明屏幕截取是令人比较感兴趣的事情.虽然现在有不少应用程序如HYPERSNAP等可以用来截取你所喜欢的屏幕画面,但是如果能把这个功能加到自己的程序中,就更能利用它强大的作用.下面用VC来逐步介绍在Windows95下的实现过程.首先我们要确定屏幕截取的区域,用LPRECT结构来定义.可以截取一个窗口,或整个屏幕.以下代码把选定的屏幕区域拷贝到位图中.HBITMAPCopyScreenToBitmap(LPRECTlpRect)//lpRect代表选定区域{HDChScrDC,hMemDC;//屏幕和内存设备描述表HBITMAPhBitm
2、ap,hOldBitmap;//位图句柄intnX,nY,nX2,nY2;//选定区域坐标intnWidth,nHeight;//位图宽度和高度intxScrn,yScrn;//屏幕分辨率//确保选定区域不为空矩形if(IsRectEmpty(lpRect))returnNULL;//为屏幕创建设备描述表hScrDC=CreateDC("DISPLAY",NULL,NULL,NULL);//为屏幕设备描述表创建兼容的内存设备描述表hMemDC=CreateCompatibleDC(hScrDC);//获得选定区域坐标nX=lpRect->left;nY=lpRect
3、->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
4、(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);//返回位图句柄returnhBitmap;}得到屏幕位图句柄以后,我们可以把屏幕
5、内容粘贴到剪贴板上.if(OpenClipboard(hWnd))//hWnd为程序窗口句柄{//清空剪贴板EmptyClipboard();//把屏幕内容粘贴到剪贴板上,hBitmap为刚才的屏幕位图句柄SetClipboardData(CF_BITMAP,hBitmap);//关闭剪贴板CloseClipboard();}我们也可以把屏幕内容以位图格式存到磁盘文件上.intSaveBitmapToFile(HBITMAPhBitmap,LPSTRlpFileName)//hBitmap为刚才的屏幕位图句柄{//lpFileName为位图文件名HDChDC;//设
6、备描述表intiBits;//当前显示分辨率下每个像素所占字节数WORDwBitCount;//位图中每个像素所占字节数//定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数DWORDdwPaletteSize=0,dwBmBitsSize,dwDIBSize,dwWritten;BITMAPBitmap;//位图属性结构BITMAPFILEHEADERbmfHdr;//位图文件头结构BITMAPINFOHEADERbi;//位图信息头结构LPBITMAPINFOHEADERlpbi;//指向位图信息头结构HANDLEfh,hDib,hPal,hOld
7、Pal=NULL;//定义文件,分配内存句柄,调色板句柄//计算位图文件每个像素所占字节数hDC=CreateDC("DISPLAY",NULL,NULL,NULL);iBits=GetDeviceCaps(hDC,BITSPIXEL)*GetDeviceCaps(hDC,PLANES);DeleteDC(hDC);if(iBits<=1)wBitCount=1;elseif(iBits<=4)wBitCount=4;elseif(iBits<=8)wBitCount=8;elseif(iBits<=24)wBitCount=24;//计算调色板大小if(wBi