資源描述:
《windows程序gdi繪圖》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、用C++語(yǔ)言實(shí)現(xiàn)Windows圖形輸出1、設(shè)備場(chǎng)境概念2、使用GDI繪圖對(duì)象3、使用GDI坐標(biāo)系統(tǒng)C++程序設(shè)計(jì)4、使用GDI繪圖213.2.7圖形輸出Windows應(yīng)用程序不支持標(biāo)準(zhǔn)輸出函數(shù)(如printf),應(yīng)用程序輸出包括文字在內(nèi)的所有數(shù)據(jù)均是以圖形方式“繪制”到窗口上的。Windows通過(guò)圖形設(shè)備接口GDI對(duì)圖形輸出進(jìn)行支持。GDI為應(yīng)用程序提供了與顯示器、打印機(jī)等輸出設(shè)備無(wú)關(guān)的圖形輸出接口,使得程序員從各種顯示、打印設(shè)備的直接處理中解脫出來(lái)。313.2.7圖形輸出GDI由幾百個(gè)函數(shù)和與此相關(guān)的數(shù)據(jù)類型、宏定義和結(jié)構(gòu)體組成。
2、主要有:獲取和釋放(或創(chuàng)建和刪除)設(shè)備描述表函數(shù)、獲取設(shè)備信息函數(shù)、使用GDI繪圖對(duì)象函數(shù)、繪圖函數(shù)、設(shè)置和獲取設(shè)備參數(shù)函數(shù)等,其顯示的圖形類型(簡(jiǎn)稱圖元)有:直線、曲線、填充、位圖、文本等。413.2.7圖形輸出1.設(shè)備場(chǎng)境Windows對(duì)圖形顯示設(shè)備進(jìn)行了封裝,形成了一個(gè)統(tǒng)一的虛擬圖形顯示設(shè)備。應(yīng)用程序可以在這個(gè)虛擬設(shè)備上進(jìn)行繪圖,而虛擬設(shè)備圖形轉(zhuǎn)換為物理設(shè)備圖形的任務(wù)則由設(shè)備驅(qū)動(dòng)程序去完成。這個(gè)虛擬圖形設(shè)備用一個(gè)包含各種設(shè)備屬性的數(shù)據(jù)結(jié)構(gòu)來(lái)表示,稱為設(shè)備場(chǎng)境DC(devicecontent),又稱設(shè)備上下文。如圖所示,設(shè)備場(chǎng)境
3、DC是指可以用來(lái)輸出圖形的對(duì)象,例如顯示器、打印機(jī)、某個(gè)窗口等等,設(shè)備場(chǎng)境句柄HDC是指向某個(gè)設(shè)備場(chǎng)境的類似指針的數(shù)據(jù)類型。513.2.7圖形輸出也就是說(shuō),從應(yīng)用程序的角度來(lái)看,設(shè)備場(chǎng)境DC就是Windows提供的一個(gè)“畫板”,程序在其上繪圖。當(dāng)程序員想在一個(gè)圖形輸出設(shè)備(例如顯示器或者打印機(jī))上繪圖時(shí),必須首先獲得設(shè)備場(chǎng)境句柄,然后以此為參數(shù)調(diào)用GDI函數(shù)繪圖。613.2.7圖形輸出圖13.14設(shè)備場(chǎng)景DC示意713.2.7圖形輸出Windows提供了幾種獲取設(shè)備場(chǎng)境句柄的方法。如果在處理一條消息時(shí)獲取了設(shè)備場(chǎng)境句柄,那么應(yīng)該在退
4、出窗口過(guò)程WndProc之前釋放它或者刪除它。一旦釋放了DC句柄,它就不能再使用了。813.2.7圖形輸出最常用的獲取設(shè)備場(chǎng)境句柄的方法是在處理WM_PAINT消息時(shí),使用BeginPaint和EndPaint調(diào)用:其中ps、hdc定義如下:hdc=BeginPaint(hWnd,&ps);//客戶區(qū)準(zhǔn)備繪圖//GDI繪圖調(diào)用......EndPaint(hWnd,&ps);//客戶區(qū)繪圖結(jié)束PAINTSTRUCTps;HDChdc;913.2.7圖形輸出變量hdc是設(shè)備場(chǎng)境句柄類型HDC變量,變量ps是類型PAINTSTRUCT的
5、結(jié)構(gòu)體變量,該結(jié)構(gòu)包含一個(gè)名為rcPaint的RECT矩形結(jié)構(gòu)成員,rcPaint定義一個(gè)包圍窗口客戶區(qū)無(wú)效范圍的矩形。使用從BeginPaint獲得的DC句柄,只能在這個(gè)區(qū)域內(nèi)繪圖。只要使用了BeginPaint就必須要用且只能用EndPaint釋放DC句柄。1013.2.7圖形輸出WM_PAINT消息是當(dāng)窗口客戶區(qū)域的一部分或全部變?yōu)椤盁o(wú)效”,以至于必須“刷新”時(shí)發(fā)生。例如新建窗口、窗口大小的調(diào)整、窗口移動(dòng)、被覆蓋部分的恢復(fù)都會(huì)產(chǎn)生刷新請(qǐng)求。如圖所示,窗口A被另一個(gè)窗口B覆蓋的區(qū)域稱為“無(wú)效”區(qū)域,因?yàn)楫?dāng)窗口B從覆蓋區(qū)域移走后,
6、圖中陰影部分對(duì)于窗口A來(lái)說(shuō)必須要刷新,否則它是窗口B的圖形。1113.2.7圖形輸出圖13.15需要重畫的無(wú)效區(qū)域1213.2.7圖形輸出應(yīng)用程序還可以在處理非WM_PAINT消息時(shí)獲取設(shè)備場(chǎng)境句柄,例如:hdc=GetDC(hWnd);//hdc得到客戶區(qū)DC句柄//GDI繪圖調(diào)用......ReleaseDC(hWnd,hdc);//釋放客戶區(qū)DC句柄1313.2.7圖形輸出GetDC得到的設(shè)備場(chǎng)境句柄是窗口hWnd客戶區(qū)的句柄。這組調(diào)用與BeginPaint和EndPaint的區(qū)別是利用從GetDC返回的句柄可以在整個(gè)客戶區(qū)上
7、繪圖,然而GetDC不會(huì)使客戶區(qū)中任何區(qū)域可能的無(wú)效區(qū)域變成有效,從顯示效果上來(lái)看,GetDC的繪圖結(jié)果將會(huì)在下次WM_PAINT消息刷新后“消失”了。1413.2.7圖形輸出應(yīng)用程序還可以獲取整個(gè)窗口的設(shè)備場(chǎng)境句柄,例如:GetWindowDC得到的設(shè)備場(chǎng)境句柄,除客戶區(qū)之外,還包括窗口的標(biāo)題欄、菜單、滾動(dòng)條和外框。使用GetDC和GetWindowDC得到的設(shè)備場(chǎng)境句柄,只能調(diào)用ReleaseDC釋放。hdc=GetWindowDC(hWnd);//hdc得到窗口DC句柄//GDI繪圖調(diào)用......ReleaseDC(hWnd
8、,hdc);//釋放窗口DC句柄1513.2.7圖形輸出BeginPaint、GetDC和GetWindowDC獲得的設(shè)備場(chǎng)境句柄與顯示器的窗口是相關(guān)的,獲取設(shè)備場(chǎng)境句柄的另一個(gè)更通用的函數(shù)是CreateDC,例如:其中l(wèi)pszDri