VC面向?qū)ο笈c可視化程序設(shè)計(jì) 第三章 Windows的圖形_第1頁(yè)
VC面向?qū)ο笈c可視化程序設(shè)計(jì) 第三章 Windows的圖形_第2頁(yè)
VC面向?qū)ο笈c可視化程序設(shè)計(jì) 第三章 Windows的圖形_第3頁(yè)
VC面向?qū)ο笈c可視化程序設(shè)計(jì) 第三章 Windows的圖形_第4頁(yè)
VC面向?qū)ο笈c可視化程序設(shè)計(jì) 第三章 Windows的圖形_第5頁(yè)
已閱讀5頁(yè),還剩50頁(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、第第3 3講講 WindowsWindows的圖形設(shè)備接口及的圖形設(shè)備接口及windowswindows繪圖繪圖 Windows圖形設(shè)備接口圖形設(shè)備接口(GDI)是為與)是為與設(shè)備無(wú)關(guān)設(shè)備無(wú)關(guān)的圖形的圖形設(shè)計(jì)的。所謂設(shè)備的無(wú)關(guān)性,就是操作系統(tǒng)屏蔽了硬件設(shè)設(shè)計(jì)的。所謂設(shè)備的無(wú)關(guān)性,就是操作系統(tǒng)屏蔽了硬件設(shè)備的差異,因而設(shè)備無(wú)關(guān)性能使用戶編程時(shí)無(wú)需考慮特殊備的差異,因而設(shè)備無(wú)關(guān)性能使用戶編程時(shí)無(wú)需考慮特殊的硬件設(shè)置的硬件設(shè)置一、圖形設(shè)備按口一、圖形設(shè)備按口( (GDI)GDI)GDI負(fù)責(zé)系統(tǒng)與用戶或繪圖程序之間的信息交換,并控制在輸出設(shè)負(fù)責(zé)系統(tǒng)與用戶或繪圖程序之間的信息交換,并控制在輸出設(shè)備上備上

2、顯示圖形顯示圖形或或文字文字, 是是Windows系統(tǒng)的重要組成部分系統(tǒng)的重要組成部分Windows支持與設(shè)備無(wú)關(guān)的圖形支持與設(shè)備無(wú)關(guān)的圖形利用利用GDI和和Windows設(shè)設(shè)備驅(qū)動(dòng)程序備驅(qū)動(dòng)程序開(kāi)發(fā)人員只要建開(kāi)發(fā)人員只要建立與輸出設(shè)備的立與輸出設(shè)備的關(guān)聯(lián),讓系統(tǒng)加關(guān)聯(lián),讓系統(tǒng)加載相應(yīng)的設(shè)備驅(qū)載相應(yīng)的設(shè)備驅(qū)動(dòng)程序即可動(dòng)程序即可1.1. GDI的一些基本概念的一些基本概念 設(shè)備描述表設(shè)備描述表即為即為設(shè)備環(huán)境設(shè)備環(huán)境的屬性的集合的屬性的集合應(yīng)用程序應(yīng)用程序與與輸出設(shè)備輸出設(shè)備之之間的橋梁間的橋梁Win系統(tǒng)系統(tǒng)外設(shè)外設(shè)直接訪問(wèn)直接訪問(wèn)不允許不允許統(tǒng)一的設(shè)備環(huán)境統(tǒng)一的設(shè)備環(huán)境(DC)提供提供使應(yīng)用程

3、序與設(shè)備相連使應(yīng)用程序與設(shè)備相連用用戶戶為確保圖形輸出為確保圖形輸出的的設(shè)備無(wú)關(guān)性設(shè)備無(wú)關(guān)性應(yīng)用應(yīng)用程序程序設(shè)備描設(shè)備描述表及述表及其屬性其屬性通過(guò)設(shè)備描述表的句柄來(lái)間接地存取通過(guò)設(shè)備描述表的句柄來(lái)間接地存取應(yīng)用程序每一次圖形操應(yīng)用程序每一次圖形操作均參照設(shè)備描述表中作均參照設(shè)備描述表中的屬性執(zhí)行的屬性執(zhí)行2.2.圖形刷新圖形刷新圖形刷新圖形刷新是繪圖過(guò)程中必須考慮的重要問(wèn)題是繪圖過(guò)程中必須考慮的重要問(wèn)題刷新請(qǐng)求刷新請(qǐng)求對(duì)刷新請(qǐng)求的響應(yīng)對(duì)刷新請(qǐng)求的響應(yīng)刷新方法刷新方法包括(1) 刷新請(qǐng)求刷新請(qǐng)求 應(yīng)用程序在窗口中應(yīng)用程序在窗口中繪制了一個(gè)橢圓,繪制了一個(gè)橢圓,顏色列表框覆蓋了顏色列表框覆蓋了橢

4、圓的一部分橢圓的一部分關(guān)閉顏色選框后,關(guān)閉顏色選框后,應(yīng)用程序需要恢應(yīng)用程序需要恢復(fù)被覆蓋部分的復(fù)被覆蓋部分的顏色和形狀顏色和形狀窗口大小的調(diào)整窗口大小的調(diào)整窗口移動(dòng)窗口移動(dòng)被覆蓋后的恢復(fù)被覆蓋后的恢復(fù)(2) 系統(tǒng)對(duì)刷新請(qǐng)求的響應(yīng)系統(tǒng)對(duì)刷新請(qǐng)求的響應(yīng) 當(dāng)用戶區(qū)的內(nèi)容需要刷新時(shí),系統(tǒng)向應(yīng)用程序消息隊(duì)當(dāng)用戶區(qū)的內(nèi)容需要刷新時(shí),系統(tǒng)向應(yīng)用程序消息隊(duì)列發(fā)送列發(fā)送WM_PAINT消息,系統(tǒng)在應(yīng)用程序的消息隊(duì)列中消息,系統(tǒng)在應(yīng)用程序的消息隊(duì)列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理三種三種刷新刷新窗口移動(dòng)后的刷新窗口移動(dòng)后的刷新被覆蓋區(qū)域的刷新被覆蓋區(qū)域的刷新對(duì)象穿越

5、后的刷新對(duì)象穿越后的刷新(系統(tǒng)自動(dòng)完成)用戶區(qū)移動(dòng)或顯示用戶區(qū)移動(dòng)或顯示用戶窗口大小改變用戶窗口大小改變程序通過(guò)滾動(dòng)條滾動(dòng)窗口程序通過(guò)滾動(dòng)條滾動(dòng)窗口窗口被另一個(gè)窗口覆蓋的窗口被另一個(gè)窗口覆蓋的恢復(fù)如下拉式菜單關(guān)閉等恢復(fù)如下拉式菜單關(guān)閉等光標(biāo)穿過(guò)用戶區(qū)光標(biāo)穿過(guò)用戶區(qū)圖標(biāo)拖過(guò)用戶區(qū)圖標(biāo)拖過(guò)用戶區(qū)窗口被另一個(gè)窗口覆蓋的區(qū)域稱(chēng)為窗口被另一個(gè)窗口覆蓋的區(qū)域稱(chēng)為無(wú)效區(qū)域無(wú)效區(qū)域。 Windows系統(tǒng)為每個(gè)窗口建立了一個(gè)系統(tǒng)為每個(gè)窗口建立了一個(gè)PAINTSTRUCT結(jié)構(gòu)結(jié)構(gòu),該結(jié)構(gòu)該結(jié)構(gòu)中包含了包圍中包含了包圍無(wú)效區(qū)域無(wú)效區(qū)域的一個(gè)最小矩形的結(jié)構(gòu)的一個(gè)最小矩形的結(jié)構(gòu)RECT,應(yīng)用程序可以應(yīng)用程序可以根據(jù)這個(gè)

6、無(wú)效矩形執(zhí)行刷新操作。根據(jù)這個(gè)無(wú)效矩形執(zhí)行刷新操作。 typedef struct tagPAINTSTRUCTtypedef struct tagPAINTSTRUCT HDC hdc HDC hdc; ;/設(shè)備環(huán)境句柄設(shè)備環(huán)境句柄 BOOL fEraseBOOL fErase; ;/一般取真值,表示擦除無(wú)效矩形的背景一般取真值,表示擦除無(wú)效矩形的背景 RECT RECT rcPaintrcPaint; ;/無(wú)效矩形標(biāo)識(shí)無(wú)效矩形標(biāo)識(shí) BOOL fRestoreBOOL fRestore; ;/系統(tǒng)保留系統(tǒng)保留 BOOL fIncUpdateBOOL fIncUpdate; ;/系統(tǒng)保留系統(tǒng)保

7、留 BYTE rgbReservedBYTE rgbReserved3232;/系統(tǒng)保留系統(tǒng)保留 PAINTSTRUCT;PAINTSTRUCT;rcPaint 為標(biāo)準(zhǔn)的為標(biāo)準(zhǔn)的RECT數(shù)據(jù)結(jié)構(gòu),其數(shù)據(jù)結(jié)構(gòu),其作用是標(biāo)識(shí)無(wú)效矩形,它包含了無(wú)效作用是標(biāo)識(shí)無(wú)效矩形,它包含了無(wú)效矩形的左上角和右下角的坐標(biāo)矩形的左上角和右下角的坐標(biāo)常用的常用的Windows應(yīng)用程序刷新窗應(yīng)用程序刷新窗口的方法口的方法保存副本。刷保存副本。刷新時(shí)將副本拷新時(shí)將副本拷貝到相應(yīng)的窗貝到相應(yīng)的窗口中口中記錄事件。刷新時(shí)記錄事件。刷新時(shí)重新執(zhí)行這個(gè)曾經(jīng)重新執(zhí)行這個(gè)曾經(jīng)發(fā)生的事件發(fā)生的事件重新繪制。將圖形繪重新繪制。將圖形繪制處

8、理程序放在消息制處理程序放在消息WM_PAINT響應(yīng)模響應(yīng)模塊中,刷新時(shí)重繪圖塊中,刷新時(shí)重繪圖形形(3) 有效的刷新方法有效的刷新方法3. 獲取設(shè)備環(huán)境的方法獲取設(shè)備環(huán)境的方法獲取設(shè)備環(huán)境是應(yīng)用程序輸出圖形的先決條件,常用的兩種方法是調(diào)用獲取設(shè)備環(huán)境是應(yīng)用程序輸出圖形的先決條件,常用的兩種方法是調(diào)用函數(shù)函數(shù)BeginPaint或或GetDC(1) 調(diào)用調(diào)用BeginPaint函數(shù)函數(shù) 應(yīng)用程序響應(yīng)應(yīng)用程序響應(yīng)WM_PAINT消息進(jìn)行圖形刷新時(shí),主要通過(guò)調(diào)用消息進(jìn)行圖形刷新時(shí),主要通過(guò)調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境函數(shù)獲取設(shè)備環(huán)境 hdc=BeginPainthdc=BeginPai

9、nt(hwnd,&(hwnd,&psps) ); /psps為為PAINTSTRUCTPAINTSTRUCT類(lèi)型結(jié)構(gòu)類(lèi)型結(jié)構(gòu)定義方式為:定義方式為:PAINTSTRUCT PAINTSTRUCT psps; ; 系統(tǒng)獲取設(shè)備環(huán)境的系統(tǒng)獲取設(shè)備環(huán)境的同時(shí)填寫(xiě)同時(shí)填寫(xiě)ps結(jié)構(gòu),以結(jié)構(gòu),以標(biāo)識(shí)無(wú)效矩形區(qū)標(biāo)識(shí)無(wú)效矩形區(qū)由由BeginPaint函數(shù)獲取的設(shè)備環(huán)境要用函數(shù)獲取的設(shè)備環(huán)境要用EndPaint函數(shù)釋放函數(shù)釋放BOOL EndPaint(HWND hwnd, PAINTSTRUCT &ps)(2) 調(diào)用調(diào)用GetDC函數(shù)函數(shù) 如果繪圖工作并非由如果繪圖工作并非由WM_PA

10、INT消息驅(qū)動(dòng),則調(diào)用消息驅(qū)動(dòng),則調(diào)用GetDC函數(shù)函數(shù)獲取設(shè)備環(huán)境。獲取設(shè)備環(huán)境。hdc=GetDChdc=GetDC(hwnd);(hwnd); 由由GetDC函數(shù)獲取的設(shè)備環(huán)境必須用函數(shù)獲取的設(shè)備環(huán)境必須用ReleaseDC函數(shù)釋放函數(shù)釋放 void ReleaseDC(HWND hwnd); B eginPaint 與與 GetDC 的的 區(qū)區(qū) 別別項(xiàng)項(xiàng) 目目 函函 數(shù)數(shù)BeginPaint 函函 數(shù)數(shù)GetDc 函函 數(shù)數(shù)使使 用用 環(huán)環(huán) 境境只只 用用 于于 圖圖 形形 刷刷 新新 時(shí)時(shí) 獲獲取取 設(shè)設(shè) 備備 環(huán)環(huán) 境境使使 用用 較較 為為 廣廣 泛泛操操 作作 區(qū)區(qū) 域域使使

11、用用 BeginPaint 函函 數(shù)數(shù)獲獲 取取 設(shè)設(shè) 備備 環(huán)環(huán) 境境 后后 ,操操 作作區(qū)區(qū) 域域 為為 無(wú)無(wú) 效效 區(qū)區(qū) 域域使使 用用GetDC 函函 數(shù)數(shù) 獲獲取取 設(shè)設(shè) 備備 環(huán)環(huán) 境境 后后 , 操操 作作區(qū)區(qū) 域域 為為 整整 個(gè)個(gè) 用用 戶戶 區(qū)區(qū)釋釋 放放 設(shè)設(shè) 備備 環(huán)環(huán)境境 所所 用用 函函 數(shù)數(shù)由由 EndPaint 函函 數(shù)數(shù) 釋釋 放放由由 ReleaseDC 函函 數(shù)數(shù) 釋釋放放4. 映像模式映像模式映像模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備映像模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備的的x方向和方向和y方向,程序員可在一個(gè)統(tǒng)一的邏輯坐標(biāo)系中操

12、作而不必方向,程序員可在一個(gè)統(tǒng)一的邏輯坐標(biāo)系中操作而不必考慮輸出設(shè)備的坐標(biāo)系情況考慮輸出設(shè)備的坐標(biāo)系情況窗口窗口:對(duì)應(yīng)邏輯坐標(biāo)系上程序員設(shè)定的區(qū)域:對(duì)應(yīng)邏輯坐標(biāo)系上程序員設(shè)定的區(qū)域視口視口:對(duì)應(yīng)實(shí)際輸出設(shè)備上程序員設(shè)定的區(qū)域:對(duì)應(yīng)實(shí)際輸出設(shè)備上程序員設(shè)定的區(qū)域窗口和視口窗口和視口如何映射?如何映射?映映像像模模式式將將一一個(gè)個(gè)邏邏輯輯單單位位映映射射為為坐坐標(biāo)標(biāo)系系設(shè)設(shè)定定MM_ANISOTROPIC系系統(tǒng)統(tǒng)確確定定OptionalMM_HIENGLISH0.001 英英寸寸Y 上上,X 右右MM_HIMETRIC0.01 毫毫米米Y 上上,X 右右MM_ISOTROPIC系系統(tǒng)統(tǒng)確確定定Op

13、tional,但但 x軸軸和和 y 軸軸的的單單位位此此例例為為 1: 1MM_LOENGLISH0.01 英英寸寸Y 上上,X 右右MM_LOMETRIC0.1 毫毫米米Y 上上,X 右右MM_TEXT一一個(gè)個(gè)像像素素Y 下下,X 右右MM_TWIPS1/1440 英英寸寸Y 上上,X 右右缺省的映射模式缺省的映射模式將窗口中的對(duì)稱(chēng)將窗口中的對(duì)稱(chēng)圖形映射到視口圖形映射到視口時(shí)仍為對(duì)稱(chēng)圖形時(shí)仍為對(duì)稱(chēng)圖形按照窗口和視口的坐按照窗口和視口的坐標(biāo)比例進(jìn)行映射標(biāo)比例進(jìn)行映射坐標(biāo)坐標(biāo)系統(tǒng)系統(tǒng)邏輯坐標(biāo)系統(tǒng)邏輯坐標(biāo)系統(tǒng)設(shè)備坐標(biāo)系統(tǒng)設(shè)備坐標(biāo)系統(tǒng)屏幕坐標(biāo)系統(tǒng)屏幕坐標(biāo)系統(tǒng)窗口坐標(biāo)系統(tǒng)窗口坐標(biāo)系統(tǒng)用戶區(qū)坐標(biāo)系統(tǒng)用戶

14、區(qū)坐標(biāo)系統(tǒng) 應(yīng)用程序可獲取設(shè)備環(huán)境的當(dāng)前映像模式,并根據(jù)需要設(shè)置映應(yīng)用程序可獲取設(shè)備環(huán)境的當(dāng)前映像模式,并根據(jù)需要設(shè)置映像模式。像模式。相關(guān)相關(guān)函數(shù)函數(shù)設(shè)置設(shè)備環(huán)境的映像模式設(shè)置設(shè)備環(huán)境的映像模式SetMapMode(hdc,nMapModeSetMapMode(hdc,nMapMode);); nMapMode為映像模式的整型標(biāo)識(shí)符為映像模式的整型標(biāo)識(shí)符獲取當(dāng)前設(shè)備環(huán)境的映像模式獲取當(dāng)前設(shè)備環(huán)境的映像模式nMapMode=GetMapMode(hdcnMapMode=GetMapMode(hdc););窗口窗口區(qū)域的定義由區(qū)域的定義由SetWindowExtEx函數(shù)完成,其函數(shù)原型形為函數(shù)完

15、成,其函數(shù)原型形為:BOOL SetWindowExtExBOOL SetWindowExtEx( HDC hdc( HDC hdc, , int nHeight,nWidth int nHeight,nWidth, /以以邏輯邏輯單位表示的窗口區(qū)域高寬度單位表示的窗口區(qū)域高寬度 LPSIZE lpSizeLPSIZE lpSize, /函數(shù)調(diào)用前窗口區(qū)域尺寸的函數(shù)調(diào)用前窗口區(qū)域尺寸的SIZESIZE結(jié)構(gòu)地址結(jié)構(gòu)地址););視口視口區(qū)域的定義由區(qū)域的定義由SetViewportExtEx函數(shù)完成,函數(shù)原型為:函數(shù)完成,函數(shù)原型為:BOOL SetViewportExtExViewportExt

16、Ex( (HDC hdcHDC hdc, ,int nHeight,nWidthint nHeight,nWidth,/,/以以物理物理設(shè)備單位表示的新視口區(qū)域高寬度設(shè)備單位表示的新視口區(qū)域高寬度LPSIZE lpSizeLPSIZE lpSize);只有在映射模式為只有在映射模式為MM_ANISOTROPIC和和MM_ISOTROPIC時(shí)才有意義時(shí)才有意義視口視口的缺省原點(diǎn)和的缺省原點(diǎn)和窗口窗口的缺省原點(diǎn)均為(的缺省原點(diǎn)均為(0,0)??赏ㄟ^(guò)調(diào)用函數(shù))??赏ㄟ^(guò)調(diào)用函數(shù)SetViewportOrgEx和和SetWindowOrgEx設(shè)定窗口與視口的原點(diǎn)。設(shè)定窗口與視口的原點(diǎn)。SetWindow

17、OrgEx函數(shù)的原形為函數(shù)的原形為:BOOL SetWindowOrgExBOOL SetWindowOrgEx( (HDC hdcHDC hdc, ,int X,Yint X,Y,/以以邏輯邏輯單位表示的窗口原點(diǎn)坐標(biāo)單位表示的窗口原點(diǎn)坐標(biāo)LPPOINT lpPointLPPOINT lpPoint/函數(shù)調(diào)用前原點(diǎn)坐標(biāo)的函數(shù)調(diào)用前原點(diǎn)坐標(biāo)的POINTPOINT結(jié)構(gòu)的地址結(jié)構(gòu)的地址););只有在映射模式為只有在映射模式為MM_ANISOTROPIC和和MM_ISOTROPIC時(shí)才有意義時(shí)才有意義二、繪圖工具與顏色二、繪圖工具與顏色1. 畫(huà)筆畫(huà)筆(1) 畫(huà)筆的創(chuàng)建畫(huà)筆的創(chuàng)建 使用畫(huà)筆之前必須事先定

18、義一個(gè)畫(huà)筆句柄。形式如下使用畫(huà)筆之前必須事先定義一個(gè)畫(huà)筆句柄。形式如下:HPEN hP;然后調(diào)用函數(shù)然后調(diào)用函數(shù)GetStockObject獲取獲取Windows系統(tǒng)定義的系統(tǒng)定義的四種四種畫(huà)筆例如畫(huà)筆例如獲取畫(huà)筆獲取畫(huà)筆BLACK_PEN的形式如下的形式如下: hPhP= =GetStockObjectGetStockObject(BLACK_PENBLACK_PEN); ;WHITE_PENBLACK_PENDC_PENNULL_PEN畫(huà)筆的操作畫(huà)筆的操作創(chuàng)建畫(huà)筆創(chuàng)建畫(huà)筆將畫(huà)筆選入設(shè)備環(huán)境將畫(huà)筆選入設(shè)備環(huán)境刪除畫(huà)筆刪除畫(huà)筆(2) 創(chuàng)建創(chuàng)建新新畫(huà)筆,形式如下畫(huà)筆,形式如下:hP=Create

19、PenhP=CreatePen(int nPenStyleint nPenStyle, ,/確定確定畫(huà)筆樣式畫(huà)筆樣式int nWidthint nWidth, , /畫(huà)筆寬度畫(huà)筆寬度COLORREF rgbColorCOLORREF rgbColor / /畫(huà)筆顏色畫(huà)筆顏色); ;創(chuàng)建畫(huà)筆后,必須調(diào)用創(chuàng)建畫(huà)筆后,必須調(diào)用SelectObject函數(shù)將其選入設(shè)備環(huán)境。函數(shù)將其選入設(shè)備環(huán)境。 SelectObject(hdc,hPSelectObject(hdc,hP);); /hP /hP為所創(chuàng)建或獲取的畫(huà)筆句柄為所創(chuàng)建或獲取的畫(huà)筆句柄不再使用當(dāng)前畫(huà)筆時(shí),需刪除畫(huà)筆,以免占內(nèi)存不再使用當(dāng)前畫(huà)筆時(shí)

20、,需刪除畫(huà)筆,以免占內(nèi)存 DeleteObject(hPDeleteObject(hP););PS_DASH:虛線虛線PS_DASHDOT:點(diǎn)劃線點(diǎn)劃線PS_DASHDOTDOT:雙點(diǎn)劃線雙點(diǎn)劃線PS_DOT:點(diǎn)線點(diǎn)線PS_INSIDEFRAME:實(shí)線實(shí)線PS_NULL:無(wú)無(wú)PS_SOLID:實(shí)線實(shí)線2. 畫(huà)刷畫(huà)刷 畫(huà)刷的創(chuàng)建與應(yīng)用與畫(huà)筆很相似,畫(huà)刷的創(chuàng)建與應(yīng)用與畫(huà)筆很相似,操作畫(huà)刷也包括操作畫(huà)刷也包括創(chuàng)建創(chuàng)建、選入設(shè)選入設(shè)備環(huán)境備環(huán)境和和刪除刪除。(1) 畫(huà)刷的創(chuàng)建畫(huà)刷的創(chuàng)建 使用畫(huà)刷需事先定義一個(gè)畫(huà)刷句柄。形式如下:使用畫(huà)刷需事先定義一個(gè)畫(huà)刷句柄。形式如下: HBRUSH hBr; /hB

21、r為畫(huà)刷句柄為畫(huà)刷句柄 然后調(diào)用函數(shù)然后調(diào)用函數(shù)GetStockObject獲取獲取Windows系統(tǒng)提供的系統(tǒng)提供的7種畫(huà)刷種畫(huà)刷 hBr=(HBRUSH)GetStockObject(nBrushStylenBrushStyle)畫(huà)刷樣式)畫(huà)刷樣式BLACK_BRUSH黑色畫(huà)刷黑色畫(huà)刷DKGRAY_BRUSH 深灰色畫(huà)刷深灰色畫(huà)刷GRAY_BRUSH灰色畫(huà)刷灰色畫(huà)刷HOLLOW_BRUSH 虛畫(huà)刷虛畫(huà)刷LTGRAY_BRUSH亮灰色畫(huà)刷亮灰色畫(huà)刷NULL_BRUSH空畫(huà)刷空畫(huà)刷WHITE_BRUSH白色畫(huà)刷白色畫(huà)刷指定顏色畫(huà)指定顏色畫(huà)刷如何獲得?刷如何獲得?可調(diào)用函數(shù)可調(diào)用函數(shù)Create

22、SolidBrush和和CreateHatchBrush創(chuàng)建畫(huà)刷創(chuàng)建畫(huà)刷,hBr=CreateSolidBrush(rgbColorhBr=CreateSolidBrush(rgbColor);); 創(chuàng)建具有創(chuàng)建具有指定顏色指定顏色的單色畫(huà)刷的單色畫(huà)刷創(chuàng)建指定陰創(chuàng)建指定陰影圖案和顏影圖案和顏色的畫(huà)刷色的畫(huà)刷(2) 選入設(shè)備環(huán)境選入設(shè)備環(huán)境 創(chuàng)建畫(huà)刷后,創(chuàng)建畫(huà)刷后, 通過(guò)通過(guò)SelectObject(hdc,hBr););將其選入設(shè)備環(huán)境將其選入設(shè)備環(huán)境(3) 刪除畫(huà)刷刪除畫(huà)刷 不使用畫(huà)刷時(shí),可用不使用畫(huà)刷時(shí),可用DeleteObject(hBr);刪除畫(huà)刷,釋放內(nèi)存刪除畫(huà)刷,釋放內(nèi)存hBr=C

23、reateHatchBrushhBr=CreateHatchBrush(int (int nHctchStylenHctchStyle, , COLORREF rgbColorCOLORREF rgbColor););HS_BDIAGONAL 45度從左上到右下度從左上到右下HS_DIAGCROSS 45度叉線度叉線HS_FDIAGONAL 45度從左下到右上度從左下到右上HS_CROSS 垂直相交的陰影線垂直相交的陰影線HS_HORIZONTAL 水平陰影線水平陰影線HS_VERTICAL垂直陰影線垂直陰影線3. 顏色顏色 Windows使用宏使用宏RGB定義繪圖的顏色,其形式為定義繪圖的顏

24、色,其形式為: RGB(nRed, nGreen,nBlue) 紅色值紅色值藍(lán)色值藍(lán)色值綠色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)三、三、 常用繪圖函數(shù)常用繪圖函數(shù)1設(shè)置畫(huà)筆當(dāng)前位置的函數(shù)設(shè)置畫(huà)筆當(dāng)前位置的函數(shù)MoveToEx, BOOL MoveToEx(HDC hdc, int X,Y,/ X、Y分別為新位置的邏輯坐標(biāo)分別為新位置的邏輯坐標(biāo) LPPOINT lpPoint/存放原畫(huà)筆位置的存放原畫(huà)筆位置的POINT結(jié)構(gòu)地址結(jié)構(gòu)地址)2 從當(dāng)前位置向指定坐標(biāo)點(diǎn)畫(huà)直線的函數(shù)從當(dāng)前位置向指定坐標(biāo)點(diǎn)畫(huà)直線的函數(shù)LineToEx,BOOL BOOL Line

25、ToExLineToEx(HDC hdc(HDC hdc,int X,int Y) /,int X,int Y) /X X和和Y Y為線段的終點(diǎn)坐標(biāo)為線段的終點(diǎn)坐標(biāo)3 從當(dāng)前位置開(kāi)始,依次用線段連接從當(dāng)前位置開(kāi)始,依次用線段連接lpPoints中指定的各點(diǎn)中指定的各點(diǎn)BOOL Polyline ( HDC hdc, LPPOINT lpPoints, /指向包含各點(diǎn)坐標(biāo)的指向包含各點(diǎn)坐標(biāo)的POINT結(jié)構(gòu)數(shù)組的指針結(jié)構(gòu)數(shù)組的指針 int nCount / nCount為為POINT數(shù)組中點(diǎn)的個(gè)數(shù)數(shù)組中點(diǎn)的個(gè)數(shù))4 繪制橢圓弧線的函數(shù)繪制橢圓弧線的函數(shù)Arc,BOOL Arc(HDC hdc,in

26、t X1,intY1,/邊框矩形左上角的邏輯坐標(biāo)邊框矩形左上角的邏輯坐標(biāo)int X2,int Y2,/邊框矩形右下角的邏輯坐標(biāo)邊框矩形右下角的邏輯坐標(biāo)int X3,int Y3,/橢圓弧起始點(diǎn)坐標(biāo)橢圓弧起始點(diǎn)坐標(biāo)int X4,int Y4/橢圓弧終止點(diǎn)坐標(biāo)橢圓弧終止點(diǎn)坐標(biāo)) (x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫(huà)曲線所畫(huà)曲線5 繪制餅圖,并用當(dāng)前畫(huà)刷進(jìn)行填充繪制餅圖,并用當(dāng)前畫(huà)刷進(jìn)行填充BOOL Pie(HDC hdc,int X1,intY1,/邊框矩形左上角的邏輯坐標(biāo)邊框矩形左上角的邏輯坐標(biāo)int X2,int Y2,/邊框矩形右下角的邏輯坐標(biāo)邊框矩形右下角的邏輯坐標(biāo)

27、int X3,int Y3,/橢圓弧起始經(jīng)線的確定點(diǎn)坐標(biāo)橢圓弧起始經(jīng)線的確定點(diǎn)坐標(biāo)int X4,int Y4/橢圓弧終止經(jīng)線的確定點(diǎn)坐標(biāo)橢圓弧終止經(jīng)線的確定點(diǎn)坐標(biāo))(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區(qū)域所填區(qū)域6 繪制矩形,并用當(dāng)前畫(huà)刷進(jìn)行填充繪制矩形,并用當(dāng)前畫(huà)刷進(jìn)行填充BOOL Rectangle(HDC hdc,int X1,int Y1,int X2,int Y2)(X1,Y1)和)和(X2,Y2)分別分別為矩形的左上角和右為矩形的左上角和右下角的邏輯坐標(biāo)下角的邏輯坐標(biāo)7 繪制圓角矩形,并用當(dāng)前畫(huà)刷填充繪制圓角矩形,并用當(dāng)前畫(huà)刷填充BOOL RoundRect

28、 (HDC hdc,int X1,int Y1,int X2,int Y2, int nHeight, int nWidth)圓角的高度和寬圓角的高度和寬度度8 繪制橢圓,并用當(dāng)前畫(huà)刷填充繪制橢圓,并用當(dāng)前畫(huà)刷填充 BOOL Ellipse(HDC hdc,intX1,intY1,intX2,intY2)9繪制多邊形,并用當(dāng)前畫(huà)刷填充繪制多邊形,并用當(dāng)前畫(huà)刷填充BOOL Polygon(HDC hdc,LPPOINT lpPoints,int nCount)包含各點(diǎn)坐標(biāo)的包含各點(diǎn)坐標(biāo)的POINT數(shù)組的地址數(shù)組的地址多邊形點(diǎn)的個(gè)數(shù)多邊形點(diǎn)的個(gè)數(shù)四、四、 應(yīng)用實(shí)例應(yīng)用實(shí)例【例【例4-1】利用繪圖函

29、數(shù)創(chuàng)建填充區(qū)。共有三個(gè)填充圖形,第一個(gè)是用】利用繪圖函數(shù)創(chuàng)建填充區(qū)。共有三個(gè)填充圖形,第一個(gè)是用深灰色畫(huà)刷填充帶圓角的矩形,第二個(gè)是采用亮灰色畫(huà)刷填充一個(gè)橢深灰色畫(huà)刷填充帶圓角的矩形,第二個(gè)是采用亮灰色畫(huà)刷填充一個(gè)橢圓型圖,第三個(gè)是用虛畫(huà)刷填充餅形圖。圓型圖,第三個(gè)是用虛畫(huà)刷填充餅形圖。#include#include#includelong WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam););使用虛畫(huà)刷填充時(shí),看不出填充效果使用虛畫(huà)刷填充時(shí),看不出填充效果!BOOL InitWindowsClass(HINSTA

30、NCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);int WINAPI WinMain/主函數(shù)主函數(shù)( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)MSG Message;if(!InitWindowsClass(hInstance)return FALSE;if(!InitWindows(hInstance,nCmdShow) return FALSE;while(GetMessage(&Mess

31、age,0,0,0)/消息循環(huán)消息循環(huán) TranslateMessage(&Message);DispatchMessage(&Message); return Message.wParam;long WINAPI long WINAPI WndProcWndProc(HWND hWnd,UINT iMessage(HWND hWnd,UINT iMessage, , UINT wParam,LONG lParam) UINT wParam,LONG lParam) HDC hDC; /定義指向設(shè)備的句柄定義指向設(shè)備的句柄 HBRUSH hBrush; /定義指向畫(huà)刷的句柄定義

32、指向畫(huà)刷的句柄 HPEN hPen;/定義指向畫(huà)筆的句柄定義指向畫(huà)筆的句柄 PAINTSTRUCT PtStr;/定義指向包含繪圖信息的結(jié)構(gòu)體變量定義指向包含繪圖信息的結(jié)構(gòu)體變量消息處理函數(shù)switch(iMessage) /處理消息處理消息case WM_PAINT: /處理繪圖消息處理繪圖消息 hDC=BeginPaint(hWnd,&PtStr); SetMapMode(hDC,MM_ANISOTROPIC); /設(shè)置映像模式設(shè)置映像模式 hPen=(HPEN)GetStockObject(BLACK_PEN); /黑色畫(huà)筆黑色畫(huà)筆 hBrush=(HBRUSH)GetStock

33、Object(DKGRAY_BRUSH); /畫(huà)刷畫(huà)刷 SelectObject(hDC,hBrush); /選擇畫(huà)刷選擇畫(huà)刷 SelectObject(hDC,hPen); /選擇畫(huà)筆選擇畫(huà)筆 RoundRect(hDC,50,120,100,200,15,15); /繪制繪制圓角矩形圓角矩形 hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); /采用亮灰色采用亮灰色畫(huà)刷畫(huà)刷下面只改變畫(huà)下面只改變畫(huà)刷,不改變筆刷,不改變筆 SelectObject(hDC,hBrush); /選擇畫(huà)刷選擇畫(huà)刷 Ellipse(hDC,150,50,200,150); /

34、繪制繪制橢圓橢圓 hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH); /虛畫(huà)刷虛畫(huà)刷 SelectObject(hDC,hBrush); /選擇畫(huà)刷選擇畫(huà)刷 Pie(hDC,250,50,300,100,250,50,300,50); /繪制繪制餅形餅形 EndPaint(hWnd,&PtStr); /結(jié)束繪圖結(jié)束繪圖 return 0;case WM_DESTROY:case WM_DESTROY: /結(jié)束應(yīng)用程序結(jié)束應(yīng)用程序PostQuitMessagePostQuitMessage(0); return 0;(0); return 0;def

35、ault:default:/其他消息處理程序其他消息處理程序return(DefWindowProc(hWnd,iMessagereturn(DefWindowProc(hWnd,iMessage,wParam,lParam) ;,wParam,lParam) ; BOOL InitWindows(HINSTANCE hInstance,int nCmdShowBOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/)/初始化窗口初始化窗口 HWND hWnd;HWND hWnd;hWnd=CreateWindow(WinFillhWnd=Crea

36、teWindow(WinFill, /, /生成窗口生成窗口 填充示例程序填充示例程序, WS_OVERLAPPEDWINDOW,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, NULL, NULL, hInstance hInstance, , NULL); NULL); if(!hWndif(!hWnd) )return FALSE;return FALSE; ShowWindow(hWnd,nCmdShow ShowWindow

37、(hWnd,nCmdShow););/顯示窗口顯示窗口 UpdateWindow(hWndUpdateWindow(hWnd);); return TRUE; return TRUE; BOOL InitWindowsClass(HINSTANCE hInstanceBOOL InitWindowsClass(HINSTANCE hInstance) )/定義窗口類(lèi)定義窗口類(lèi) WNDCLASS WndClass WNDCLASS WndClass; ; WndClass.cbClsExtra WndClass.cbClsExtra=0;=0; WndClass.cbWndExtra WndCl

38、ass.cbWndExtra=0;=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH);(WHITE_BRUSH); WndClass.hCursor=LoadCursor WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon WndClass.hIcon=LoadIcon(NULL,END);(NULL,END

39、); WndClass.hInstance=hInstance WndClass.hInstance=hInstance; ; WndClass.lpfnWndProc=WndProc WndClass.lpfnWndProc=WndProc; ; WndClass.lpszClassName WndClass.lpszClassName=WinFillWinFill; WndClass.lpszMenuName WndClass.lpszMenuName=NULL;=NULL; WndClass WndClass.style=CS_HREDRAW|CS_VREDRAW;.style=CS_H

40、REDRAW|CS_VREDRAW; return RegisterClass(&WndClass return RegisterClass(&WndClass);); 例例4-2: 應(yīng)用畫(huà)筆和畫(huà)刷等工具繪制如圖所示的圖形應(yīng)用畫(huà)筆和畫(huà)刷等工具繪制如圖所示的圖形1 #include2 #include3 #include4 long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);5 BOOL InitWindowsClass(HINSTANCE hInstance);6 BOOL InitWindo

41、ws(HINSTANCE hInstance,int nCmdShow);7 /主函數(shù)主函數(shù)8 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)9 MSG Message;10if(!InitWindowsClass(hInstance)return FALSE;11if(!InitWindows(hInstance,nCmdShow)return FALSE;12while(GetMessage(&Message,0,0,0)/消息循環(huán)消息循環(huán)13

42、TranslateMessage(&Message);14DispatchMessage(&Message); 15return Message.wParam;long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)1 HDC hDC; /定義設(shè)備環(huán)境句柄定義設(shè)備環(huán)境句柄2 HBRUSH hBrush; /定義畫(huà)刷的句柄定義畫(huà)刷的句柄3 HPEN hPen;/定義畫(huà)筆的句柄定義畫(huà)筆的句柄4 PAINTSTRUCT PtStr; /定義指向包含繪圖信息的結(jié)構(gòu)體變量定義指向包含繪圖信息的結(jié)構(gòu)體變量 /定

43、義一個(gè)定義一個(gè)POINT數(shù)組,包括數(shù)組,包括6個(gè)點(diǎn)個(gè)點(diǎn) 5 POINT points6=100,212,70,227,70,250,130,250,130,227,100,212; 6 switch(iMessage) /處理消息處理消息 7 case WM_PAINT: /處理繪圖消息處理繪圖消息 8 hDC=BeginPaint(hWnd,&PtStr);9hPen=(HPEN)GetStockObject(NULL_PEN); /獲取系統(tǒng)定義的空畫(huà)筆獲取系統(tǒng)定義的空畫(huà)筆10SelectObject(hDC,hPen); /選擇畫(huà)筆選擇畫(huà)筆11hBrush=(HBRUSH)GetS

44、tockObject(BLACK_BRUSH); /獲取系統(tǒng)定義的畫(huà)刷獲取系統(tǒng)定義的畫(huà)刷12SelectObject(hDC,hBrush); /選擇畫(huà)刷選擇畫(huà)刷13LineTo(hDC,50,50); /畫(huà)線畫(huà)線14DeleteObject(hPen); /刪除畫(huà)筆刪除畫(huà)筆15hPen=CreatePen(PS_SOLID,2,RGB(255,0,0); /創(chuàng)建畫(huà)筆創(chuàng)建畫(huà)筆16SelectObject(hDC,hPen); /選擇畫(huà)筆選擇畫(huà)筆/畫(huà)一個(gè)三角形畫(huà)一個(gè)三角形17LineTo(hDC,150,50);18LineTo(hDC,100,137);19LineTo(hDC,50,50);

45、1 Polyline(hDC,points,6); /畫(huà)一個(gè)五邊形畫(huà)一個(gè)五邊形2Arc(hDC,63,137,138,212,100,137,100,137); /畫(huà)一個(gè)圓畫(huà)一個(gè)圓3Pie(hDC,213,137,288,212,240,137,260,137); /畫(huà)一個(gè)圓餅畫(huà)一個(gè)圓餅4Rectangle(hDC,213,212,287,250); /畫(huà)一個(gè)長(zhǎng)方形畫(huà)一個(gè)長(zhǎng)方形5RoundRect(hDC,213,100,287,137,20,20); /畫(huà)一個(gè)圓角長(zhǎng)方形畫(huà)一個(gè)圓角長(zhǎng)方形6DeleteObject(hPen); /刪除畫(huà)筆刪除畫(huà)筆7DeleteObject(hBrush); /

46、刪除畫(huà)刷刪除畫(huà)刷8EndPaint(hWnd,&PtStr); /結(jié)束繪圖結(jié)束繪圖9return 0;10case WM_DESTROY: /結(jié)束應(yīng)用程序結(jié)束應(yīng)用程序11PostQuitMessage(0);12return 0;13default:/其他消息處理程序其他消息處理程序14return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) /初始化窗口初始化窗口HWND hWnd;hWnd=CreateWindow(WinFill, /

47、生成窗口生成窗口填充示例程序填充示例程序,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);if(!hWnd)return FALSE;ShowWindow(hWnd,nCmdShow);/顯示窗口顯示窗口UpdateWindow(hWnd);return TRUE;BOOL InitWindowsClass(HINSTANCE hInstance) /定義窗口類(lèi)定義窗口類(lèi)WNDCLASS WndClass; WndClass.cbClsExtra=0; WndClass.cbWndExt

48、ra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,END); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName=WinFill; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VRED

49、RAW; return RegisterClass(&WndClass);【例【例4-3】設(shè)置映射與使用映射模式。程序的初始】設(shè)置映射與使用映射模式。程序的初始階段按模式階段按模式MM_TEXT繪圖,用戶單擊鼠標(biāo)以改變映繪圖,用戶單擊鼠標(biāo)以改變映射模式,單擊左鍵,產(chǎn)生射模式,單擊左鍵,產(chǎn)生WM_LBUTTONDOWN消息消息,通知應(yīng)用程序設(shè)置映射模式為,通知應(yīng)用程序設(shè)置映射模式為ISOTROPIC,并調(diào)用并調(diào)用InvalidateRect函數(shù)刷新用戶區(qū),在用戶單擊鼠標(biāo)右函數(shù)刷新用戶區(qū),在用戶單擊鼠標(biāo)右鍵時(shí),產(chǎn)生鍵時(shí),產(chǎn)生WM_RBUTTONDOWN消息,應(yīng)用程序?qū)⑾?,?yīng)用程序?qū)⒂成淠?/p>

50、式設(shè)置成映射模式設(shè)置成ANSIOTROPIC,同時(shí)刷新用戶區(qū)。同時(shí)刷新用戶區(qū)。LRESULT CALLBACK WndProc(,)HDC hdc; PAINTSTRUCT ps; HBRUSH hB1,hB2; switch(message) case WM_LBUTTONDOWN:/單擊鼠標(biāo)左鍵的消息單擊鼠標(biāo)左鍵的消息nMode=MM_ISOTROPIC;/更改映射模式為更改映射模式為MM_ISOTROPICInvalidateRect(hwnd,NULL,1);/刷新用戶區(qū)刷新用戶區(qū)break; case WM_RBUTTONDOWN:/單擊鼠標(biāo)右鍵消息單擊鼠標(biāo)右鍵消息nMode=MM_

51、ANISOTROPIC;/更改顯示模式為更改顯示模式為MM_ANISOTROPICInvalidateRect(hwnd,NULL,1);/刷新用戶區(qū)刷新用戶區(qū)break;case WM_PAINT:hdc=BeginPaint(hwnd,&ps);/取得設(shè)備環(huán)境句柄取得設(shè)備環(huán)境句柄SetMapMode(hdc,nMode);/設(shè)置映射模式設(shè)置映射模式SetWindowExtEx(hdc,150,150,NULL); /設(shè)置窗口區(qū)域設(shè)置窗口區(qū)域SetViewportExtEx(hdc,150,100,NULL); /設(shè)置視口區(qū)域設(shè)置視口區(qū)域SetViewportOrgEx(hdc,15

52、0,60,NULL); /設(shè)置視口原點(diǎn)設(shè)置視口原點(diǎn)hB1=(HBRUSH)GetStockObject(WHITE_BRUSH); /定義白色畫(huà)刷定義白色畫(huà)刷hB2=(HBRUSH)GetStockObject(BLACK_BRUSH); /定義黑色畫(huà)刷定義黑色畫(huà)刷SelectObject(hdc,hB1);/將黑白刷選入設(shè)備環(huán)境將黑白刷選入設(shè)備環(huán)境RoundRect(hdc,0,0,150,150,30,30);/繪制圓角矩形并填充繪制圓角矩形并填充SelectObject(hdc,hB2);/更改當(dāng)前畫(huà)刷為黑色畫(huà)刷更改當(dāng)前畫(huà)刷為黑色畫(huà)刷 Ellipse(hdc,0,10,150,140);

53、/繪制橢圓并填充繪制橢圓并填充EndPaint(hwnd,&ps);/釋放設(shè)備環(huán)境句柄釋放設(shè)備環(huán)境句柄DeleteObject(hB1);/刪除畫(huà)刷句柄刪除畫(huà)刷句柄DeleteObject(hB2);break;case WM_DESTROY:PostQuitMessage(0);break; default:return DefWindowProc(hwnd,message,wParam,lParam); return 0; 【例【例4-4】編寫(xiě)一個(gè)程序,在屏幕上出現(xiàn)一個(gè)圓心沿正弦曲線軌跡移動(dòng)編寫(xiě)一個(gè)程序,在屏幕上出現(xiàn)一個(gè)圓心沿正弦曲線軌跡移動(dòng)的實(shí)心圓,而且,每隔四分之一周期,圓的填

54、充色和圓的周邊顏色都的實(shí)心圓,而且,每隔四分之一周期,圓的填充色和圓的周邊顏色都發(fā)生變化,同時(shí),圓的半徑在四分之一周期之內(nèi)由正弦曲線幅值的發(fā)生變化,同時(shí),圓的半徑在四分之一周期之內(nèi)由正弦曲線幅值的0.20.2倍至倍至0.60.6倍線性增長(zhǎng)。倍線性增長(zhǎng)。(1) (1) 正弦曲線是此題的基礎(chǔ)。在正弦曲線是此題的基礎(chǔ)。在WndMainWndMain()()函數(shù)消息循環(huán)前,生成正函數(shù)消息循環(huán)前,生成正弦曲線各點(diǎn)的坐標(biāo)。把正弦曲線一個(gè)周期的橫坐標(biāo)分成弦曲線各點(diǎn)的坐標(biāo)。把正弦曲線一個(gè)周期的橫坐標(biāo)分成100100個(gè)等分點(diǎn)個(gè)等分點(diǎn),存儲(chǔ)在數(shù)組,存儲(chǔ)在數(shù)組lpSinlpSin100100中,中,100100個(gè)點(diǎn)

55、的坐標(biāo)計(jì)算如下:個(gè)點(diǎn)的坐標(biāo)計(jì)算如下:for(intfor(int j=0;j100;j+) j=0;j100;j+)/生成正弦曲線的點(diǎn)坐標(biāo)生成正弦曲線的點(diǎn)坐標(biāo) lpSinj.x=(long)(jlpSinj.x=(long)(j* *2 2* *Pi/100Pi/100* *60);60);lpSinj.y=(long)(dfRangelpSinj.y=(long)(dfRange* *sin(jsin(j* *2 2* *Pi/100);Pi/100); (2) (2) 動(dòng)態(tài)顯示圓在正弦曲線上移動(dòng)動(dòng)態(tài)顯示圓在正弦曲線上移動(dòng)數(shù)組數(shù)組lpSinlpSin100100的長(zhǎng)度為的長(zhǎng)度為100100設(shè)

56、定圓在正弦曲線移動(dòng)時(shí)共有設(shè)定圓在正弦曲線移動(dòng)時(shí)共有100100個(gè)位置個(gè)位置數(shù)組中每一個(gè)值是圓移動(dòng)時(shí)圓心的坐標(biāo)數(shù)組中每一個(gè)值是圓移動(dòng)時(shí)圓心的坐標(biāo)每四分之一周期有每四分之一周期有2525個(gè)位置個(gè)位置i=25i=25處于第處于第1 1個(gè)個(gè)1/41/4周期,創(chuàng)建周期,創(chuàng)建紅色畫(huà)筆和畫(huà)刷紅色畫(huà)筆和畫(huà)刷;25i5025i50處于第處于第2 2個(gè)個(gè)1/41/4周期,創(chuàng)建周期,創(chuàng)建綠色畫(huà)筆和畫(huà)刷綠色畫(huà)筆和畫(huà)刷;50i7550i75處于第處于第3 3個(gè)個(gè)1/41/4周期,創(chuàng)建周期,創(chuàng)建藍(lán)色畫(huà)筆和畫(huà)刷藍(lán)色畫(huà)筆和畫(huà)刷;75i10075i100處于第處于第4 4個(gè)個(gè)1/41/4周期,創(chuàng)建周期,創(chuàng)建黃色畫(huà)筆和畫(huà)刷黃色畫(huà)

57、筆和畫(huà)刷; if(i=25) if(i=25) /第一個(gè)第一個(gè)1/41/4周期周期 hPen=CreatePen hPen=CreatePen(PS_DASH,1,RGB(255,0,0);(PS_DASH,1,RGB(255,0,0); hBrush=CreateHatchBrush hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0);(HS_BDIAGONAL,RGB(255,0,0); lRadious=(long)(dfRange lRadious=(long)(dfRange* *0.2+i%250.2+i%25* *dfRangedf

58、Range* *0.4/25);/0.4/25);/計(jì)算半徑計(jì)算半徑 在消息在消息WM_PAINTWM_PAINT處理程序中,調(diào)用函數(shù)處理程序中,調(diào)用函數(shù)BeginPaintBeginPaint()()獲得設(shè)備獲得設(shè)備環(huán)境句柄。由此經(jīng)過(guò)線性差分計(jì)算圓半徑的大小環(huán)境句柄。由此經(jīng)過(guò)線性差分計(jì)算圓半徑的大小lRadiouslRadious,第,第1 1個(gè)個(gè)1/41/4周期的程序代碼如下:周期的程序代碼如下:創(chuàng)建的畫(huà)筆和畫(huà)刷選入設(shè)備環(huán)境后,調(diào)用函數(shù)創(chuàng)建的畫(huà)筆和畫(huà)刷選入設(shè)備環(huán)境后,調(diào)用函數(shù)Ellipse(Ellipse() )繪制圓形繪制圓形下面這段代碼是動(dòng)態(tài)顯示的關(guān)鍵:下面這段代碼是動(dòng)態(tài)顯示的關(guān)鍵:S

59、leep(100);Sleep(100);/停停0.10.1秒秒if(i100) InvalidateRect(hWndif(i100) InvalidateRect(hWnd,NULL,1);/,NULL,1);/刷新用戶區(qū)刷新用戶區(qū) 調(diào)用調(diào)用Sleep(100)Sleep(100)函數(shù)使程序暫停函數(shù)使程序暫停0.10.1秒。所含參數(shù)秒。所含參數(shù)100100代表暫停的代表暫停的時(shí)間,使用毫秒作單位。時(shí)間,使用毫秒作單位。i100i100時(shí)調(diào)用函數(shù)刷新用戶時(shí)調(diào)用函數(shù)刷新用戶區(qū)發(fā)送區(qū)發(fā)送WM_PAINTWM_PAINT消息消息消息發(fā)到的消息發(fā)到的窗口的句柄窗口的句柄代表刷新代表刷新整個(gè)用戶區(qū)整個(gè)

60、用戶區(qū)代表清除用戶區(qū)中代表清除用戶區(qū)中所有的顯示內(nèi)容所有的顯示內(nèi)容#include #include #include #include #define Pi 3.1415926long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);double dfTheta=0,dfRange=100.0;/正弦曲線的角度變量正弦曲線的角度變量.long i=0,j=0;long lCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange);/定義圓心坐標(biāo)和圓半徑定義圓心坐標(biāo)和圓半徑.POINT lpSin100;/定義正弦曲線的點(diǎn)坐標(biāo)定義正弦曲線的點(diǎn)坐標(biāo).int WINAPI WinMain(,.) / 填寫(xiě)窗口類(lèi)屬性填寫(xiě)窗口類(lèi)屬性if(!Reg

溫馨提示

  • 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)論