屏幕抓圖程序DIY_第1頁(yè)
屏幕抓圖程序DIY_第2頁(yè)
屏幕抓圖程序DIY_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、    屏幕抓圖程序的關(guān)鍵有兩點(diǎn):一是應(yīng)該知道鼠標(biāo)在屏幕上有準(zhǔn)確位置;二是應(yīng)該知道欲抓圖的窗口句柄;三是如何對(duì)抓到的圖片進(jìn)行保存的問(wèn)題。對(duì)于問(wèn)題一,很簡(jiǎn)單,利用SetCapture函數(shù)便能夠追蹤鼠標(biāo)的移動(dòng)(包括在屏幕抓圖程序窗口之外的窗口)。應(yīng)該注意的是,SetCapture的具體功能并不像MSDN中所說(shuō)的那樣:調(diào)用SetCapture一次直到使用ReleaseCapture終止鼠標(biāo)捕獲前都會(huì)起到對(duì)鼠標(biāo)的捕獲作用,實(shí)際上,在使用過(guò)程中,你會(huì)發(fā)現(xiàn),在進(jìn)行了一次鼠標(biāo)捕獲之后,SetCapture便失去了作用,這可能是SetCapture函數(shù)的一個(gè)Bug。所以

2、,在編程時(shí),最好能夠不斷地調(diào)用SetCapture函數(shù),以保證SetCapture能夠?qū)κ髽?biāo)進(jìn)行正確無(wú)誤的捕獲。對(duì)于問(wèn)題二,這時(shí)會(huì)用到一個(gè)平時(shí)我們不常用的函數(shù):WindowFromPoint,這個(gè)函數(shù)能夠找出鼠標(biāo)當(dāng)前位置所對(duì)應(yīng)的窗口句柄。具體用法可以參見(jiàn)MSDN,這里不做詳細(xì)敘述。同時(shí),用過(guò)SnagIT有朋友都知道,在選擇抓圖窗口時(shí),鼠標(biāo)的在位置的窗口都會(huì)出現(xiàn)加粗的紅色邊框(如圖一所示),以提醒目前所選擇的窗口,這個(gè)功能實(shí)現(xiàn)起來(lái)有些復(fù)雜,下面仔細(xì)來(lái)看看詳細(xì)說(shuō)明。 在GDI中,最常見(jiàn)的一個(gè)概念就設(shè)備環(huán)境(DC),每一個(gè)窗口都相應(yīng)的具有自己的DC。如果能夠調(diào)用到窗口的DC,那么,我們便能夠在窗口上

3、的任何位置繪圖。然而,在屏幕抓圖程序中,由于用戶所選擇的窗口是不固定的,所以,要想得到鼠標(biāo)所在處的窗口的DC,不是很容易。能不能夠隨心所欲地在屏幕上進(jìn)行繪圖但又不僅限于特定的窗口?可以,別忘了,GetDC能夠做到這點(diǎn)!GetDC我們都用得太多了,都快習(xí)慣了GetDC的函數(shù)申明:HDC GetDC( HWND hWnd),hWnd是DC對(duì)應(yīng)的窗口句柄,當(dāng)hWnd為空的,該函數(shù)返回的是整個(gè)屏幕的設(shè)備環(huán)境句柄!這就意味著我們可以在屏幕上進(jìn)行任意繪圖。在鼠標(biāo)所在處的窗口進(jìn)行繪圖時(shí),繪圖本身的目只是為了提醒用戶目前所選擇的窗口,所以,在進(jìn)行繪圖時(shí),必須得保證不會(huì)破壞窗口原有的畫面。這點(diǎn)很好辦,將窗口的D

4、C繪圖模式設(shè)為R2_NOTXORPEN(將畫筆顏色與屏幕顏色進(jìn)行異或后,再將屏幕顏取反),這樣,在同一個(gè)地方進(jìn)行兩次繪圖后(對(duì)同一像素進(jìn)行兩次異或運(yùn)算,像素值并不會(huì)發(fā)生變化),窗口的畫面并不會(huì)發(fā)生任何變化! 從上面的說(shuō)明可以看出,制作屏幕抓圖程序應(yīng)分三步走: 1、 啟用鼠標(biāo)捕獲 2、 在鼠標(biāo)所在處的窗口進(jìn)行繪圖,提醒抓圖的目標(biāo) 3、 選定目標(biāo)窗口時(shí),將目標(biāo)窗口的畫面保存為自定義的位圖(在本文中,我將畫面保存至剪貼板上),并終止鼠標(biāo)捕獲 下面我們就按照上面的思路進(jìn)行編程操作。首先新建一個(gè)基于對(duì)話框的項(xiàng)目ScreenCapture,然后準(zhǔn)備好一個(gè)外形為相機(jī)的光標(biāo)文件(*.cur),將之引入資源管理

5、器(IDC_CAMERA)。接著在CscreenCaptureDlg類中加入兩個(gè)全局變量: HWND hwndCapture; CRect rectCapture; 然后通過(guò)類向?qū)Ъ尤雽?duì)WM_MOUSEMOVE及WM_LBUTTONUP事件的響應(yīng)函數(shù),基響應(yīng)函數(shù)代碼如下: void CScreenCaptureDlg:OnMouseMove(UINT nFlags, CPoint point)    /如果用戶將鼠標(biāo)左鍵按住不放,則開(kāi)始抓取圖片 if(nFlags=MK_LBUTTON) /隱藏程序窗口,以免影響在抓取時(shí)的“視野” ShowWindow(

6、SW_HIDE); /裝入“照相機(jī)”鼠標(biāo),開(kāi)始追蹤鼠標(biāo)的移動(dòng) HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CAMERA ); SetCursor(cur); SetCapture(); /獲得鼠標(biāo)所在處的窗口句柄 ClientToScreen(&point); hwndCapture=(HWND):WindowFromPoint(point); /取得屏幕的設(shè)備環(huán)境句柄,以便在屏幕的任何位置繪圖 HDC hDC=:GetDC(NULL); /建立一紅色的畫筆 HPEN hPen =CreatePen

7、(PS_INSIDEFRAME,6, RGB(255,0,0); /將繪圖模式設(shè)為R2_NOTXORPEN,在繪圖時(shí)可以不破壞原有的背景 int nMode =SetROP2(hDC, R2_NOTXORPEN); HPEN hpenOld= (HPEN)SelectObject(hDC, hPen); /得到鼠標(biāo)所在處的窗口的區(qū)域 :GetWindowRect(hwndCapture,&rectCapture); /在鼠標(biāo)所在處的窗口四周畫一紅色的矩形,做為選定時(shí)的提醒 POINT pt5; pt0 = CPoint(rectCapture.left, rectCapture.top

8、); 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);  /延時(shí)后再重繪紅色的矩形,這樣就不會(huì)破壞原有內(nèi)容 Sleep(100); :Polyline(hDC,pt,5); :Sele

9、ctObject(hDC,hpenOld); :ReleaseDC(NULL,hDC); CDialog:OnMouseMove(nFlags, point); void CScreenCaptureDlg:OnLButtonUp(UINT nFlags, CPoint point)    /得到鼠標(biāo)所在處的窗口的區(qū)域?qū)?、?#160; int nWidth=rectCapture.Width(); int nHeight=rectCapture.Height(); HDC hdcScreen, hMemDC;  HBITM

10、AP hBitmap, hOldBitmap;  /建立一個(gè)屏幕設(shè)備環(huán)境句柄 hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); hMemDC = CreateCompatibleDC(hdcScreen); /建立一個(gè)與屏幕設(shè)備環(huán)境句柄兼容、與鼠標(biāo)所在處的窗口的區(qū)域等大的位圖 hBitmap = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight); / 把新位圖選到內(nèi)存設(shè)備描述表中 hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap); / 把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中 BitBlt(hMemDC, 0, 0, nWidth, nHeight, hdcScreen,rectCapture.left,rectCapture.top,SRCCOPY); /取回鼠標(biāo)所在

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論