抓圖軟件課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  屏幕截圖軟件設(shè)計(jì)</b></p><p>  摘要: 本文闡述 VC++實(shí)現(xiàn)屏幕截圖功能的原理和具體設(shè)計(jì)步驟,所實(shí)現(xiàn)的這個(gè)抓圖軟件可以截取整個(gè)屏幕,截取指定的窗口,并將截取到的圖像以bmp文件形式保存到指定的路徑下。技術(shù)重點(diǎn)在鼠標(biāo)在屏幕上的準(zhǔn)確定位;如何獲取抓圖的窗口句柄;如何對(duì)抓到的圖片進(jìn)行保存的問(wèn)題。技術(shù)難點(diǎn)在如何將所抓取的屏幕窗口保存為磁盤(pán)BMP文件形式。

2、</p><p>  關(guān)鍵詞:屏幕截圖;BMP位圖;設(shè)備環(huán)境(DC)</p><p><b>  1 引言</b></p><p>  在我們的日常上網(wǎng)活動(dòng)當(dāng)中比如看電影、玩游戲、做圖等等會(huì)對(duì)一些畫(huà)面特別喜歡!但是卻沒(méi)有辦法將這些畫(huà)面以圖片形式保存下來(lái),真是猶如“水中月,鏡中花”看得到卻得不到。由于QQ的出現(xiàn),曾改變了幾億人的交流生活方式,它的

3、里面嵌入的任意截圖功能,更是為人們的生活增添了無(wú)限的歡愉和快樂(lè),通過(guò)截圖自己可以將最喜歡的游戲畫(huà)面,最喜歡的電影畫(huà)面,以圖片形式保存,可以及時(shí)的發(fā)給好友共享,給我們帶來(lái)了意想不到的幫助和驚喜。</p><p>  另外系統(tǒng)的功能強(qiáng)大的截圖軟件在社會(huì)建設(shè)的各個(gè)領(lǐng)域都到了施展空間,為人們的工作生活創(chuàng)造了極大的方便,解決了許多棘手難題??梢哉f(shuō)呀抓圖軟件有很廣闊的應(yīng)用前景,雖然它不算是很龐大的系統(tǒng)軟件,但是其它的大型的主

4、流系統(tǒng)軟件能夠嵌入抓圖的功能,必將受到極大的歡迎和青睞。</p><p>  所以在此次軟件課程設(shè)計(jì)當(dāng)中,我選擇了用VC制作屏幕截圖的軟件,實(shí)現(xiàn)截取指定窗口,整個(gè)屏幕的功能,并且將截取的圖形以BMP文件形式存放在指定路徑的磁盤(pán)當(dāng)中。本文將系統(tǒng)介紹截圖軟件的設(shè)計(jì)原理,設(shè)計(jì)步驟,設(shè)計(jì)方法,和運(yùn)用的重點(diǎn)技術(shù)。</p><p>  2 實(shí)現(xiàn)基本原理和運(yùn)用相關(guān)技術(shù)</p><p&

5、gt;  抓圖軟件基本原理就是把屏幕上所抓取的圖像復(fù)制到內(nèi)存中,并最后將內(nèi)存中的圖像內(nèi)容以位圖文件形式保存到磁盤(pán)當(dāng)中。在這此軟件設(shè)計(jì)當(dāng)中,如果用戶將鼠標(biāo)左鍵按住不放,則開(kāi)始抓取圖片,此時(shí)隱藏程序窗口,以免影響在抓取時(shí)的“視野”,接著裝入“魔法棒”鼠標(biāo),開(kāi)始追蹤鼠標(biāo)的移動(dòng),然后獲得鼠標(biāo)所在處的窗口句柄,取得屏幕的設(shè)備環(huán)境句柄,以便在屏幕的任何位置繪圖。接下來(lái)建立一紅色的畫(huà)筆,得到鼠標(biāo)所在處的窗口的區(qū)域,在鼠標(biāo)所在處的窗口四周畫(huà)一紅色的矩形

6、,做為選定時(shí)的提醒。當(dāng)鼠標(biāo)左鍵釋放的時(shí)候得到鼠標(biāo)所在處的窗口的區(qū)域?qū)挕⒏?,然后建立一個(gè)屏幕設(shè)備環(huán)境句柄和與屏幕設(shè)備環(huán)境句柄兼容、與鼠標(biāo)所在處的窗口的區(qū)域等大的位圖,把新位圖選到內(nèi)存設(shè)備描述表中,最后把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中,終止鼠標(biāo)捕獲,恢復(fù)窗口顯示模式。那么最后要作的工作就是寫(xiě)一個(gè)位圖保存函數(shù)將內(nèi)存當(dāng)中的窗口圖片信息以位圖形式保存到指定磁盤(pán)當(dāng)中。在整個(gè)程序當(dāng)中要用到大量的函數(shù):比如申請(qǐng)內(nèi)存空間用于存放位圖文件 Glob

7、alAlloc(GHND,F(xiàn)ileLength); 位圖文件讀入所申請(qǐng)內(nèi)存空間中LoadFileToMemory( mpBitsS</p><p>  屏幕抓圖程序的關(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)(包括在屏幕抓圖程序窗口之外的窗口)。對(duì)于問(wèn)題二,這時(shí)會(huì)用到一個(gè)平時(shí)

8、我們不常用的函數(shù):WindowFromPoint,其函數(shù)用法如下:HWND WindowFromPoint{ POINT Point; //坐標(biāo)};這個(gè)函數(shù)能夠找出鼠標(biāo)當(dāng)前位置所對(duì)應(yīng)的窗口句柄。具體用法可以參見(jiàn)MSDN,這里不做詳細(xì)敘述。在選擇抓圖窗口時(shí),鼠標(biāo)的在位置的窗口都會(huì)出現(xiàn)加粗的有色邊框,以提醒目前所選擇的窗口,這個(gè)功能實(shí)現(xiàn)起來(lái)有些復(fù)雜,它的代碼如下:</p><p>  POINT pt[5];

9、</p><p>  pt[0] = CPoint(rectCapture.left, rectCapture.top); </p><p>  pt[1] = CPoint(rectCapture.right,rectCapture.top); </p><p>  pt[2] = CPoint(rectCapture.right,rectCapture.bott

10、om); </p><p>  pt[3] = CPoint(rectCapture.left, rectCapture.bottom); </p><p>  pt[4] = CPoint(rectCapture.left, rectCapture.top);</p><p>  在GDI中,最常見(jiàn)的一個(gè)概念就設(shè)備環(huán)境(DC),每一個(gè)窗口都相應(yīng)的具有自己的DC。如

11、果能夠調(diào)用到窗口的DC,那么,我們便能夠在窗口上的任何位置繪圖。然而,在屏幕抓圖程序中,由于用戶所選擇的窗口是不固定的,所以,要想得到鼠標(biāo)所在處的窗口的DC,不是很容易。但是能夠隨心所欲地在屏幕上進(jìn)行繪圖卻又不僅限于特定的窗口,GetDC能夠做到這點(diǎn)! GetDC的函數(shù)申明:HDC GetDC( HWND hWnd),hWnd是DC對(duì)應(yīng)的窗口句柄,當(dāng)hWnd為空時(shí),該函數(shù)返回的是整個(gè)屏幕的設(shè)備環(huán)境句柄!這就意味著我們可以在屏幕上進(jìn)行任意

12、繪圖。在鼠標(biāo)所在處的窗口進(jìn)行繪圖時(shí),繪圖本身的目的只是為了提醒用戶目前所選擇的窗口,所以,在進(jìn)行繪圖時(shí),必須得保證不會(huì)破壞窗口原有的畫(huà)面。這點(diǎn)很好辦,將窗口的DC繪圖模式設(shè)為R2_NOTXORPEN(將畫(huà)筆顏色與屏幕顏色進(jìn)行異或后,再將屏幕顏取反),這樣,在同一個(gè)地方進(jìn)行兩次繪圖后(對(duì)同一像素進(jìn)行兩次異或運(yùn)算,像素值并不會(huì)發(fā)生變化),窗口的畫(huà)面并不會(huì)發(fā)生任何變化。以上就是此次截圖軟件設(shè)計(jì)當(dāng)中運(yùn)用的相關(guān)技術(shù)和設(shè)計(jì)實(shí)現(xiàn)原理。</p&g

13、t;<p><b>  3 軟件詳細(xì)設(shè)計(jì)</b></p><p>  3.1建立基于對(duì)話框的工程文件</p><p>  啟動(dòng)Visual C++,生成一個(gè)基于對(duì)話框的工程,工程名為“Capture”. 然后準(zhǔn)備好一個(gè)外形為細(xì)長(zhǎng)矩形的光標(biāo)文件(*.cur),將之引入資源管理器(IDC_CAMERA)。接著在CCaptureDlg類中加入兩個(gè)全局變量:HW

14、ND hwndCapture; CRect rectCapture; UINT nFlags;</p><p>  CPoint point;LPCTSTR lpFileName;HBITMAP hBitmap;</p><p>  3.2添加消息響應(yīng)函數(shù)</p><p>  然后通過(guò)類向?qū)Ъ尤雽?duì)WM_MOUSEMOVE及WM_LBUTTONUP事件的響應(yīng)函數(shù),添加

15、WM_MOUSEMOVE事件的響應(yīng)函數(shù)代碼該函數(shù)主要實(shí)現(xiàn)的功能:鼠標(biāo)左鍵按住不放,則開(kāi)始抓取圖片,此時(shí)隱藏程序窗口,以免影響在抓取時(shí)的“視野”,接著裝入“魔法棒”鼠標(biāo),開(kāi)始追蹤鼠標(biāo)的移動(dòng),然后獲得鼠標(biāo)所在處的窗口句柄,取得屏幕的設(shè)備環(huán)境句柄,以便在屏幕的任何位置繪圖。接下來(lái)建立一紅色的畫(huà)筆,得到鼠標(biāo)所在處的窗口的區(qū)域,在鼠標(biāo)所在處的窗口四周畫(huà)一紅色的矩形,做為選定時(shí)的提醒。</p><p>  void CCap

16、tureDlg::OnMouseMove(UINT nFlags, CPoint point) </p><p><b>  {</b></p><p>  //如果用戶將鼠標(biāo)左鍵按住不放,則開(kāi)始抓取圖片 </p><p>  if(nFlags==MK_LBUTTON) </p><p><b>  { &l

17、t;/b></p><p>  //隱藏程序窗口,以免影響在抓取時(shí)的“視野” </p><p>  ShowWindow(SW_HIDE); </p><p>  //裝入“魔法棒”鼠標(biāo),開(kāi)始追蹤鼠標(biāo)的移動(dòng) </p><p>  HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTR

18、ESOURCE(IDC_CAMERA )); </p><p>  SetCursor(cur); </p><p>  SetCapture(); </p><p>  //獲得鼠標(biāo)所在處的窗口句柄 </p><p>  ClientToScreen(&point); </p><p>  hwndCaptu

19、re=(HWND)::WindowFromPoint(point); </p><p>  //取得屏幕的設(shè)備環(huán)境句柄,以便在屏幕的任何位置繪圖 </p><p>  HDC hDC=::GetDC(NULL); </p><p>  //建立一紅色的畫(huà)筆 </p><p>  HPEN hPen =CreatePen(PS_INSIDEFR

20、AME,6, RGB(255,0,0)); </p><p>  //將繪圖模式設(shè)為R2_NOTXORPEN,在繪圖時(shí)可以不破壞原有的背景 </p><p>  int nMode =SetROP2(hDC, R2_NOTXORPEN); </p><p>  HPEN hpenOld= (HPEN)SelectObject(hDC, hPen); </p&g

21、t;<p>  //得到鼠標(biāo)所在處的窗口的區(qū)域 </p><p>  ::GetWindowRect(hwndCapture,&rectCapture); </p><p>  //在鼠標(biāo)所在處的窗口四周畫(huà)一紅色的矩形,做為選定時(shí)的提醒 </p><p>  POINT pt[5]; </p><p>  pt[0] =

22、 CPoint(rectCapture.left, rectCapture.top); </p><p>  pt[1] = CPoint(rectCapture.right,rectCapture.top); </p><p>  pt[2] = CPoint(rectCapture.right,rectCapture.bottom); </p><p>  pt

23、[3] = CPoint(rectCapture.left, rectCapture.bottom); </p><p>  pt[4] = CPoint(rectCapture.left, rectCapture.top); </p><p>  ::Polyline(hDC,pt,5); </p><p>  //延時(shí)后再重繪紅色的矩形,這樣就不會(huì)破壞原有內(nèi)容

24、 </p><p>  Sleep(100); </p><p>  ::Polyline(hDC,pt,5); </p><p>  ::SelectObject(hDC,hpenOld); </p><p>  ::ReleaseDC(NULL,hDC); </p><p><b>  } </b&

25、gt;</p><p>  CDialog::OnMouseMove(nFlags, point);</p><p><b>  }</b></p><p>  添加WM_LBUTTONUP事件的響應(yīng)函數(shù)代碼:該函數(shù)主要實(shí)現(xiàn)當(dāng)鼠標(biāo)左鍵釋放的時(shí)候得到鼠標(biāo)所在處的窗口的區(qū)域?qū)?、高,然后建立一個(gè)屏幕設(shè)備環(huán)境句柄和與屏幕設(shè)備環(huán)境句柄兼容、與鼠標(biāo)所在處的

26、窗口的區(qū)域等大的位圖,把新位圖選到內(nèi)存設(shè)備描述表中,最后把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中,終止鼠標(biāo)捕獲,恢復(fù)窗口顯示模式。</p><p>  void CCaptureDlg::OnLButtonUp(UINT nFlags, CPoint point) </p><p>  {//得到鼠標(biāo)所在處的窗口的區(qū)域?qū)挕⒏?</p><p>  int nWidt

27、h=rectCapture.Width(); </p><p>  int nHeight=rectCapture.Height(); </p><p>  HDC hdcScreen, hMemDC; </p><p>  HBITMAP hOldBitmap; </p><p>  //建立一個(gè)屏幕設(shè)備環(huán)境句柄 </p>

28、<p>  hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); </p><p>  hMemDC = CreateCompatibleDC(hdcScreen); </p><p>  //建立一個(gè)與屏幕設(shè)備環(huán)境句柄兼容、與鼠標(biāo)所在處的窗口的區(qū)域等大的位圖 </p><p>  hB

29、itmap = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight); </p><p>  // 把新位圖選到內(nèi)存設(shè)備描述表中 </p><p>  hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap); </p><p>  // 把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表

30、中 </p><p>  BitBlt(hMemDC,0,0,nWidth,nHeight,hdcScreen,rectCapture.left,rectCapture.top,SRCCOPY); </p><p>  //取回鼠標(biāo)所在處的窗口屏幕位圖的句柄 </p><p>  hBitmap =(HBITMAP)SelectObject(hMemDC, hOld

31、Bitmap); </p><p>  DeleteDC(hdcScreen); </p><p>  DeleteDC(hMemDC); </p><p>  MessageBox("屏幕內(nèi)容已經(jīng)剪切獲得,請(qǐng)單擊對(duì)話框菜單按紐保存為BMP文件!"); </p><p><b>  //終止鼠標(biāo)捕獲 </b

32、></p><p>  ReleaseCapture(); </p><p>  //恢復(fù)窗口顯示模式 </p><p>  ShowWindow(SW_NORMAL); </p><p>  CDialog::OnLButtonUp(nFlags, point);</p><p><b>  }<

33、;/b></p><p>  3.3將抓取的窗口圖片保存為位圖文件存取</p><p>  設(shè)計(jì)保存函數(shù)SaveBitmapToFile(HBITMAP hBitmap, LPCTSTR lpFileName),并且在前面對(duì)話框類里面進(jìn)行函數(shù)聲明。此函數(shù)是整個(gè)軟件設(shè)計(jì)當(dāng)中的技術(shù)難點(diǎn),要特別對(duì)BMP位圖文件非常熟悉,BMP文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成。BMP

34、文件頭數(shù)據(jù)結(jié)構(gòu)含有BMP文件的類型、文件大小和位圖起始位置等信息。位圖文件的類型,必須為BM位圖文件的大小,以字節(jié)為單位,位圖文件保留字,必須為0位圖數(shù)據(jù)的起始位置,以相對(duì)于位圖文件頭的偏移量表示,以字節(jié)為單位。BMP位圖信息頭數(shù)據(jù)用于說(shuō)明位圖的尺寸等信息。在typedef struct tagBITMAPINFOHEADER結(jié)構(gòu)當(dāng)中DWORD biSize表示本結(jié)構(gòu)所占用字節(jié)數(shù);LONGbiWidth表示位圖的寬度;以像素為單位LON

35、GbiHeight表示位圖的高度,以像素為單位WORD biPlanes表示目標(biāo)設(shè)備的級(jí)別,必須為1;WORD biBitCount表示每個(gè)像素所需的位數(shù),必須是1(雙色),4(16色),8(256色)或24(真彩色)之一;DWORD biCompression; </p><p>  {BITMAPINFOHEADER bmiHeader; // 位圖信息頭RGBQUAD bmiColors[1]; //

36、顏色表} BITMAPINFO;位圖數(shù)據(jù)記錄了位圖的每一個(gè)像素值,記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上。位圖的一個(gè)像素值所占的字節(jié)數(shù): 當(dāng)biBitCount=1時(shí),8個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=4時(shí),2個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=8時(shí),1個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=24時(shí),1個(gè)像素占3個(gè)字節(jié);Windows規(guī)定一個(gè)掃描行所占的字節(jié)數(shù)必須是 4的倍數(shù)(即以long為單位),不

37、足的以0填充, 一個(gè)掃描行所占的字節(jié)數(shù)計(jì)算方法: DataSizePerLine= (biWidth* biBitCount+31)/8表示一個(gè)掃描行所占的字節(jié)數(shù); DataSizePerLine= DataSizePerLine/4*4表示字節(jié)數(shù)必須是4的倍數(shù) ,位圖數(shù)據(jù)的大小(不壓縮情況下):DataSize= DataSizePerLine* biHeight; 在SaveBitmapToFile()當(dāng)中首先<

38、/p><p>  3.4軟件界面設(shè)計(jì)和其它相關(guān)功能設(shè)計(jì)</p><p>  由于本軟件是基于對(duì)話框的工程,其界面相對(duì)比較單一簡(jiǎn)單,那么為了使得界面比較漂亮美觀,我特別進(jìn)行了對(duì)話框的漸變色設(shè)計(jì),使界面有夢(mèng)幻般的感覺(jué)。對(duì)話框的漸變色效果是在OnPaint()函數(shù)中實(shí)現(xiàn)的 ,具體實(shí)現(xiàn)細(xì)節(jié)在這里不多做描述了。在軟件設(shè)計(jì)的最后收尾階段,實(shí)現(xiàn)文件的退出菜單功能設(shè)計(jì)。圖1是該抓圖軟件的運(yùn)行界面圖形。<

39、/p><p><b> ?。▓D1)</b></p><p>  3.5軟件運(yùn)行功能測(cè)試圖</p><p>  啟動(dòng)工程執(zhí)行程序,出現(xiàn)圖1程序界面時(shí),用鼠標(biāo)按下左鍵,程序界面便隱藏,于是拖動(dòng)鼠標(biāo)開(kāi)始屏幕抓圖。當(dāng)鼠標(biāo)左鍵釋放后,程序會(huì)彈出一個(gè)MessageBox對(duì)話框來(lái)提醒您已經(jīng)抓取了指定窗口的圖片請(qǐng)單擊對(duì)話框菜單按鈕保存為指定磁盤(pán)路徑的BMP文件,接

40、下來(lái)程序窗口出現(xiàn),最后點(diǎn)擊菜單按鈕保存抓取的窗口圖片。</p><p>  圖2就是抓取的全屏位圖。 </p><p><b> ?。▓D2)</b></p><p>  此抓圖軟件不僅僅可以抓取全屏圖案,還可以抓取任意指定窗口的圖形。圖3是 抓取指定小窗口的BMP圖片。</p&g

41、t;<p><b>  (圖3)</b></p><p>  當(dāng)抓圖結(jié)束后,可以單擊界面上的菜單退出按鈕安全退出,此時(shí)程序又會(huì)彈出一個(gè)MessageBox對(duì)話框提醒您是否確定要退出程序。通過(guò)大量的調(diào)試和運(yùn)行,該抓圖軟件運(yùn)行穩(wěn)定,抓取保存速度比較快,整體性能比較理想。完成了任意指定窗口的界面截取功能及保存功能。</p><p>  4 存在問(wèn)題和改進(jìn)意見(jiàn)&

42、lt;/p><p>  在此次屏幕截圖軟件設(shè)計(jì)當(dāng)中主要面對(duì)三個(gè)問(wèn)題,一是如何知道鼠標(biāo)在屏幕上的準(zhǔn)確位置;二是如何知道欲抓圖的窗口句柄;三是如何對(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)捕

43、獲前都會(huì)起到對(duì)鼠標(biāo)的捕獲作用,實(shí)際上,在使用過(guò)程中,就會(huì)發(fā)現(xiàn),在進(jìn)行了一次鼠標(biāo)捕獲之后,SetCapture便失去了作用,這可能是SetCapture函數(shù)的一個(gè)Bug。所以,在編程時(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)的窗口句柄。</p><p&

44、gt;  問(wèn)題最多當(dāng)要屬問(wèn)題三:如何對(duì)抓到的圖片進(jìn)行保存且保存為指定位置的bmp文件,這個(gè)是整個(gè)程序設(shè)計(jì)當(dāng)中的難點(diǎn)也是最麻煩的出了很多棘手的問(wèn)題,由于需要設(shè)計(jì)一個(gè)這樣的保存函數(shù),限于自身水平就參考了網(wǎng)上同仁編寫(xiě)的這種功能的函數(shù),于是拿到自己的程序中調(diào)用此函數(shù)便陷入了尷尬的境地,首先是出現(xiàn)了二三十處語(yǔ)法錯(cuò)誤經(jīng)過(guò)耐心修改全部搞定,但是執(zhí)行程序,單擊保存按鈕卻無(wú)法進(jìn)行保存,一運(yùn)行會(huì)發(fā)出錯(cuò)誤報(bào)告然后自動(dòng)退出,經(jīng)過(guò)確定是程序邏輯錯(cuò)誤,后經(jīng)過(guò)調(diào)試是

45、應(yīng)為在寫(xiě)這個(gè)函數(shù)的時(shí)候,一個(gè)參數(shù)有問(wèn)題,是因?yàn)樵搮?shù)是在前面的一個(gè)函數(shù)中定義過(guò)且為私有變量,后面的函數(shù)需要調(diào)用這個(gè)參數(shù),來(lái)獲取屏幕位圖窗口句柄,那么這個(gè)參數(shù)就需要設(shè)置為全局變量,在這里我就犯了這個(gè)低級(jí)錯(cuò)誤。接著執(zhí)行程序抓圖保存,但是令人驚訝的是機(jī)子接近崩潰的邊緣,運(yùn)行比“蝸?!边€慢,等大約6-7分鐘后,一切才恢復(fù)正常,最后到保存的指定文件中去查看所保存的抓取圖片,讓人吃驚的是保存的圖片大小為655M,怪不得執(zhí)行程序后會(huì)那么慢,經(jīng)過(guò)分析問(wèn)

46、題出在,設(shè)置保存為BMP文件得時(shí)候,抓取窗口得長(zhǎng)寬大小在函數(shù)SaveBitmapToFile()中并沒(méi)有獲得,那么程序運(yùn)行得時(shí)候就</p><p>  為所抓取的圖片數(shù)據(jù)沒(méi)有獲得,用DEBUG設(shè)置斷點(diǎn)調(diào)試明顯顯示GetDIBits()的數(shù)據(jù)值為0,但是始終搞不清楚為什么所獲得的位圖數(shù)據(jù)值是零,龍滿生老師細(xì)心的幫我分析,最后才確定出罪魁禍?zhǔn)资荄eleteDC(hDC);該函數(shù)用錯(cuò)了位置,它在GetDIBits()函

47、數(shù)調(diào)用之前便調(diào)用了那么當(dāng)然獲取的位圖數(shù)據(jù)為零了,于是調(diào)整DeleteDC(hDC)為在GetDIBits()函數(shù)調(diào)用之后調(diào)用,終于解決了這個(gè)問(wèn)題。那么到最后該軟件就算大功告成了。</p><p>  該軟件特別要改經(jīng)的地方那就是能夠像QQ抓圖那樣任意拖動(dòng)鼠標(biāo),截取任意大小的圖片,并且所見(jiàn)即所抓,不管它是什么東東,游戲畫(huà)面也好,電影畫(huà)面也好,F(xiàn)LANSH,靜態(tài)圖片等等,像怎么抓就怎么抓。但是限于自身能力有限還有時(shí)間

48、的關(guān)系,這些更棒功能等以后再實(shí)現(xiàn)吧</p><p><b>  5 結(jié)束語(yǔ)</b></p><p>  在此論文當(dāng)中主要介紹 VC++實(shí)現(xiàn)屏幕截圖功能的實(shí)現(xiàn)基本原理和運(yùn)用的相關(guān)技術(shù)詳細(xì)介紹了軟件的具體設(shè)計(jì)步驟,所實(shí)現(xiàn)的這個(gè)抓圖軟件可以截取整個(gè)屏幕,截取指定的窗口,并將截取到的圖像以bmp文件形式保存到指定的路徑下。技術(shù)重點(diǎn)在鼠標(biāo)在屏幕上的準(zhǔn)確定位;如何獲取抓圖的窗口句

49、柄;如何對(duì)抓到的圖片進(jìn)行保存的問(wèn)題。技術(shù)難點(diǎn)在如何將所抓取的屏幕窗口保存為磁盤(pán)BMP文件形式。</p><p>  在整個(gè)設(shè)計(jì)當(dāng)中要運(yùn)用大量的圖形操作函數(shù),特別是在設(shè)計(jì)保存功能的時(shí)候,要對(duì)位圖文件結(jié)構(gòu)有相當(dāng)深刻的了解,通過(guò)此次設(shè)計(jì)自己掌握了很多技術(shù)如:追蹤鼠標(biāo)的移動(dòng),如何獲得鼠標(biāo)所在處的窗口句柄,如何取得屏幕的設(shè)備環(huán)境句柄得到鼠標(biāo)所在處的窗口的區(qū)域?qū)挕⒏?,如何建立一個(gè)屏幕設(shè)備環(huán)境句柄和與屏幕設(shè)備環(huán)境句柄兼容、與鼠

50、標(biāo)所在處的窗口的區(qū)域等大的位圖,如何把新位圖選到內(nèi)存設(shè)備描述表中,如何把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中等等。</p><p>  最后要特別感謝龍滿生老師,在這兩個(gè)禮拜的軟件設(shè)計(jì)當(dāng)中,龍滿生老師作為我的導(dǎo)師給予了我巨大的幫助和指導(dǎo),自己在這個(gè)過(guò)程當(dāng)中學(xué)會(huì)了很多很多東西,比如如何分析程序出錯(cuò)的原因,如何解決問(wèn)題的方法,特別是我感受到了要想作為一名好的編程人員所應(yīng)具備的素質(zhì),通過(guò)老師的指導(dǎo)我還領(lǐng)會(huì)了DEBUG斷

51、點(diǎn)調(diào)試的妙用,從這里我更深入的理解了程序運(yùn)行的機(jī)制和參數(shù)數(shù)據(jù)間的傳遞以及函數(shù)的相互調(diào)用。同時(shí)增強(qiáng)了自己的編程能力和一些作為編程人員所因具有的耐性和仔細(xì),體會(huì)到了溝通協(xié)作的重要性,總之在這兩個(gè)禮拜的軟件課程設(shè)計(jì)當(dāng)中自己學(xué)到了很多很多。</p><p><b>  參考文獻(xiàn)</b></p><p>  1.何東健. 數(shù)字圖像處理. 西安:西安電子科技大學(xué)出版社,2003&

52、lt;/p><p>  2.楊永國(guó).Visual C++ 6.0實(shí)用教程. 北京:清華大學(xué)出版社,2004</p><p>  3.張力. Visual C++高級(jí)編程. 北京:人民郵電出版社,2002</p><p>  4.《電腦編程技巧與維護(hù)》雜志社,Visual C/C++編程精選集錦(數(shù)據(jù)庫(kù)和圖形圖像分冊(cè)).北京:科學(xué)出版社,2003</p>

溫馨提示

  • 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ù)僅提供信息存儲(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)論