VC++面向?qū)ο笈c可視化程序設(shè)計(jì)課件_第1頁(yè)
VC++面向?qū)ο笈c可視化程序設(shè)計(jì)課件_第2頁(yè)
VC++面向?qū)ο笈c可視化程序設(shè)計(jì)課件_第3頁(yè)
VC++面向?qū)ο笈c可視化程序設(shè)計(jì)課件_第4頁(yè)
VC++面向?qū)ο笈c可視化程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩591頁(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)介

1VC++面向?qū)ο笈c可視化程式設(shè)計(jì)2第一講VC++集成開(kāi)發(fā)環(huán)境第一講VC++集成開(kāi)發(fā)環(huán)境第一講VC++集成開(kāi)發(fā)環(huán)境第一講VC++集成開(kāi)發(fā)環(huán)境第一講VC++集成開(kāi)發(fā)環(huán)境31VisualC++簡(jiǎn)介是Windows環(huán)境下最主要的應(yīng)用開(kāi)發(fā)系統(tǒng)之一是C++語(yǔ)言的集成開(kāi)發(fā)環(huán)境與Win32緊密相連強(qiáng)大的調(diào)試功能為大型複雜軟體的開(kāi)發(fā)提供了有效的排錯(cuò)手段2可視化指軟體開(kāi)發(fā)階段的可視化利用電腦圖形技術(shù)和方法一、VisualC++6.0簡(jiǎn)介及開(kāi)發(fā)環(huán)境的構(gòu)成43開(kāi)發(fā)環(huán)境開(kāi)發(fā)環(huán)境是程式員同VC++的交互介面通過(guò)它,可以創(chuàng)建工程檔訪問(wèn)資源編輯器使用內(nèi)部調(diào)試器訪問(wèn)程式源代碼54菜單簡(jiǎn)介Edit菜單File菜單View菜單Insert菜單6Project菜單Build菜單Tools菜單Windows菜單7File->New->Files(1)VC++的菜單欄File菜單8File->New->Projects9中斷點(diǎn)作用:中斷程式的執(zhí)行過(guò)程,以便檢查程式代碼、變數(shù)和寄存器值位置中斷點(diǎn)數(shù)據(jù)中斷點(diǎn)消息中斷點(diǎn)用來(lái)設(shè)置刪除和查看中斷點(diǎn)(a)Breakpoints選項(xiàng)(2)VC++的菜單欄Edit菜單10位置中斷點(diǎn)通常在源代碼的指定行、函數(shù)的開(kāi)始或指定的記憶體地址處設(shè)置,當(dāng)程式執(zhí)行到指定位置時(shí),位置中斷點(diǎn)將中斷程式的執(zhí)行在位置中斷點(diǎn)中還可以設(shè)置中斷點(diǎn)條件,此時(shí)必須先指定位置,然後再設(shè)置條件中斷點(diǎn)數(shù)據(jù)中斷點(diǎn)是在變數(shù)或運(yùn)算式上設(shè)置,當(dāng)變數(shù)或運(yùn)算式的值改變時(shí),數(shù)據(jù)斷點(diǎn)將中斷程式的執(zhí)行消息中斷點(diǎn)是在窗口函數(shù)WndProc上設(shè)置,當(dāng)接收到指定的消息時(shí),消息斷點(diǎn)將中斷程式的執(zhí)行11(b)ListMembers選項(xiàng)利用此選項(xiàng),可減輕輸入代碼的工作量。如在變數(shù)名之後鍵入“.”或“->”,系統(tǒng)就會(huì)自動(dòng)顯示所有有效的成員名供選擇(c)TypeInfo選項(xiàng)

如果在源代碼中將滑鼠指針停在某一變數(shù)或函數(shù)上,那麼系統(tǒng)將顯示所指變數(shù)或函數(shù)等的語(yǔ)法提供有效的成員名12(d)ParameterInfo選項(xiàng)

當(dāng)輸入代碼時(shí),若在輸入函數(shù)名之後鍵入左括弧,系統(tǒng)將顯示該函數(shù)的完整原型,並用黑體顯示其第一個(gè)參數(shù)。輸入第一個(gè)參數(shù)之後,接著就會(huì)出現(xiàn)第二個(gè)參數(shù),依此類推(e)CompleteWord選項(xiàng)

系統(tǒng)自動(dòng)完成當(dāng)前語(yǔ)句其餘部分的輸入。如果不能自動(dòng)完成,則給出適當(dāng)?shù)奶崾据o助用戶完成13在View菜單中可以:改變窗口改變工具欄的顯示方式檢查源代碼啟動(dòng)調(diào)試等View->ClassWizard選項(xiàng)(a)ClassWizard選項(xiàng)(3)VC++的菜單欄View菜單14(a-1)ClassWizard中的MessageMaps選項(xiàng)卡為窗口、對(duì)話框、控件、菜單選項(xiàng)和加速鍵等對(duì)象映射消息創(chuàng)建或刪除消息處理函數(shù)查看消息處理函數(shù)的代碼15(a-2)MemberVariables選項(xiàng)卡:定義成員變數(shù)用於自動(dòng)初始化其中:

ControlIDs是映射到成員變數(shù)的控件ID值

Type是成員變數(shù)的類型

Member是成員變數(shù)名16(a-3)Automation選項(xiàng)卡:

此選項(xiàng)卡主要將在創(chuàng)建新類時(shí),添加自動(dòng)化方法和屬性列出已經(jīng)添加到當(dāng)前類中的方法和屬性的名稱Externalnames中的方法和屬性的實(shí)現(xiàn)方法17(a-4)ClassInfo選項(xiàng)卡:提供有關(guān)類的資訊18(b)ResourceSymbols選項(xiàng)

該選項(xiàng)將打開(kāi)資源符號(hào)流覽器,從中可以流覽資源編輯符號(hào)資源編輯符號(hào)是映射到整數(shù)值上的一串字元,相當(dāng)於資源的一個(gè)代號(hào),在同一個(gè)程式中,資源編輯符號(hào)不能重複19(c)ResourceIncludes選項(xiàng)

該對(duì)話框包含資源符號(hào)頭檔案名和預(yù)處理指令。20(d)Workspace選項(xiàng)

如果工作區(qū)沒(méi)有顯示或者不是處?kù)懂?dāng)前狀態(tài),則選擇該項(xiàng)將顯示工作區(qū)窗口。(e)Output選項(xiàng)

在輸出窗口中顯示程式建立過(guò)程(如編譯、鏈接等)的有關(guān)資訊或錯(cuò)誤資訊,並且顯示調(diào)試運(yùn)行時(shí)的輸出結(jié)果。21(a)NewClass選項(xiàng)該選項(xiàng)用來(lái)創(chuàng)建新類並添加到專案中(4)VC++的菜單欄Insert菜單22(b)NewForm選項(xiàng)該選項(xiàng)用來(lái)創(chuàng)建新的表單並添加到專案中(c)Resource選項(xiàng)該選項(xiàng)將打開(kāi)InsertResource對(duì)話框,用以創(chuàng)建新的資源或插入資源檔中(d)ResourceCopy選項(xiàng)要選中該選項(xiàng)必須先選中某個(gè)資源,否則呈灰色。該選項(xiàng)用於複製選定的資源23(e)NewATLObject選項(xiàng)該選項(xiàng)將啟動(dòng)ATLObjectWizard,以便添加新的ATL對(duì)象24使用Project可以創(chuàng)建、修改和存儲(chǔ)正在編輯的工程檔

工程檔組合了一個(gè)應(yīng)用程式的所有原始檔案的組成部分。工程檔包含在擴(kuò)展名為.MAK的檔中。(5)VC++的菜單欄Project菜單25(b)AddToProject選項(xiàng)

選擇該選項(xiàng)將打開(kāi)一個(gè)級(jí)聯(lián)子菜單通過(guò)級(jí)連子菜單,可以把檔、檔夾、資料鏈接以及VC組件或控件添加到當(dāng)前工程檔中在該子菜單中可以進(jìn)行如下操作:(1)New:創(chuàng)建新的檔;(2)NewFolder:插入新的檔夾;(3)Files:插入已有檔;(4)DataConnection:添加資料鏈接;(5)ComponentandControls:通過(guò)該項(xiàng)將可以插入VC組件或者已註冊(cè)的ActiveX控件。插入時(shí)相當(dāng)於插入相關(guān)的頭檔(.h檔)和實(shí)現(xiàn)檔(.cpp檔),並且更新工作區(qū)窗口的資訊。(a)SetActiveProject選項(xiàng)設(shè)定指定的專案為工作區(qū)的活動(dòng)專案26(c)Settings選項(xiàng)選擇該選項(xiàng)將彈出ProjectSettings對(duì)話框,其中General選項(xiàng)卡用來(lái)設(shè)置基礎(chǔ)類用法和目錄指出應(yīng)用程式與MFC的鏈接方式指出所建立的應(yīng)用程式的缺省位置為Debug目錄輸出檔的位置27Build菜單用於編譯、建立和執(zhí)行應(yīng)用程式(b)Build選項(xiàng)對(duì)最後修改過(guò)的原始檔案進(jìn)行編譯和鏈接(a)Compile選項(xiàng)只編譯當(dāng)前檔而不調(diào)用鏈接器或其他工具。輸出窗口將顯示編譯過(guò)程檢查出的錯(cuò)誤或警告資訊,在錯(cuò)誤資訊處單擊滑鼠右鍵,可以得到錯(cuò)誤代碼的位置(c)

RebuildAll選項(xiàng)該選項(xiàng)允許用戶編譯所有的原始檔案,而不管它們何時(shí)曾經(jīng)被修改過(guò)(6)VC++的菜單欄Build菜單28(d)BatchBuild選項(xiàng)

該選項(xiàng)能單步重新建立多個(gè)工程檔,並允許用戶指定要建立的專案類型Win32Release(發(fā)行版)、Win32Debug(調(diào)試版)。VC提供了兩種應(yīng)用程式類型29(e)

StartDebug選項(xiàng)從當(dāng)前語(yǔ)句開(kāi)始執(zhí)行程序直到遇到斷點(diǎn)或遇到程式結(jié)束單步執(zhí)行程式,並在遇到函數(shù)調(diào)用時(shí)進(jìn)入函數(shù)內(nèi)部再?gòu)念^單步執(zhí)行使程式在運(yùn)行到當(dāng)前光標(biāo)所在位置時(shí)停止(相當(dāng)於設(shè)置一個(gè)臨時(shí)中斷點(diǎn))調(diào)試過(guò)程中直接進(jìn)入到正在運(yùn)行的進(jìn)程中30(a)SourceBrowse選項(xiàng)

編譯器在建立項(xiàng)目時(shí)會(huì)創(chuàng)建與專案中每一程式檔資訊有關(guān)的.SBR檔。BSCMAKE程式將這些.SBR檔彙編為單個(gè)流覽資訊資料庫(kù)

選擇SourceBrowse將彈出流覽窗口,它顯示與程式中所有符號(hào)(類、函數(shù)、數(shù)據(jù)、宏和類型)有關(guān)的資訊Tools菜單允許用戶快速地訪問(wèn)多個(gè)不同的開(kāi)發(fā)工具(7)VC++的菜單欄Tools菜單31(b)VisualComponentManager選項(xiàng)

該工具可以在某個(gè)工程中組織、尋找和插入相關(guān)組件,而且還可以識(shí)別已存在的且可利用的對(duì)象。選擇該選項(xiàng)將彈出如圖所示的窗口32在工作區(qū)中添加專案:

用File->Open選項(xiàng)可打開(kāi)已存在的專案;通過(guò)New對(duì)話框的Projects選項(xiàng)卡創(chuàng)建新的專案,並選擇Addtocurrentworkspace複選框。

VC以專案工作區(qū)的形式來(lái)組織檔、專案和專案配置1.創(chuàng)建新的專案工作區(qū)創(chuàng)建新的空工作區(qū)步驟:(a)File->New->Workspaces->輸入工作區(qū)名字並指定工作區(qū)目錄二、專案與專案工作區(qū)332.專案工作區(qū)窗口簡(jiǎn)介

VC專案工作區(qū)由ClassView、ResourceView及FileView三個(gè)面板組成34在VC中,源代碼或資源編輯器為了引用資源和用戶自定義的其他對(duì)象,於是就引入了一種與資源一一對(duì)應(yīng)的符號(hào)即資源符號(hào),使之能夠以字串的方式被引用。

資源符號(hào)是映射到整數(shù)值上的一串字元,是一種識(shí)別字。每當(dāng)創(chuàng)建一個(gè)新的資源或資源對(duì)象時(shí),系統(tǒng)就會(huì)為其提供一個(gè)缺省的資源符號(hào)名稱並賦一個(gè)整數(shù)值,該定義保存在resource.h檔中。資源圖示游標(biāo)菜單位圖對(duì)話框資源是一種介面元素,用戶可以從中獲得資訊並在其中執(zhí)行某個(gè)動(dòng)作三、資源及資源編輯器35單擊New按鈕新建資源符號(hào)輸入新資源符號(hào)的名稱由於資源符號(hào)不能重複,因此應(yīng)按照一種標(biāo)準(zhǔn)來(lái)定義資源符號(hào)進(jìn)行符號(hào)定義View->ResourceSymbols(1)資源的建立36資源符號(hào)的取值範(fàn)圍一般為0~32767(2)資源符號(hào)定義的常用首碼

37程式調(diào)試工具包括根源程式語(yǔ)法檢查、可執(zhí)行程式修改和運(yùn)行監(jiān)視等應(yīng)用程式Help和Setup開(kāi)發(fā)工具包系統(tǒng)函數(shù)庫(kù)和系統(tǒng)函數(shù)開(kāi)發(fā)工具資源管理器包括圖形化窗口及組成元素的多種對(duì)象的編輯器可選擇並構(gòu)成具體語(yǔ)句或根源程式結(jié)構(gòu)的例程庫(kù)及Help根源程式編輯器和編譯器可視化開(kāi)發(fā)系統(tǒng)集成了一系列系統(tǒng)可用資源和開(kāi)發(fā)工具一、Windows編程基礎(chǔ)38採(cǎi)用互動(dòng)式方法時(shí),可視化開(kāi)發(fā)平臺(tái)給出了許多選用的對(duì)象,程式員可選擇所需對(duì)象並確定其屬性,由此搭建起應(yīng)用程式的“大框架”,並可根據(jù)需要進(jìn)一步編寫(xiě)必要的細(xì)節(jié)代碼段,最後構(gòu)成完整的應(yīng)用程式Windows的程式設(shè)計(jì)語(yǔ)言VCVBVJ都是“面向?qū)ο蟆钡某淌皆O(shè)計(jì)語(yǔ)言對(duì)象是Windows的規(guī)範(fàn)部件窗口菜單按鈕對(duì)話框程式模組編寫(xiě)Windows程式相當(dāng)一部分工作是在創(chuàng)建對(duì)象和為對(duì)象屬性賦值對(duì)象特徵:具有規(guī)範(fàn)形態(tài)和操作模式編程方法傳統(tǒng)編寫(xiě)法-->API互動(dòng)式方法-->MFC39APIAPI函數(shù)的功能為應(yīng)用程式提供Windows系統(tǒng)特殊函數(shù)及數(shù)據(jù)結(jié)構(gòu)Win應(yīng)用程式可以利用標(biāo)準(zhǔn)大量API函數(shù)調(diào)用系統(tǒng)功能是Win系統(tǒng)與Win應(yīng)用程式間的標(biāo)準(zhǔn)程式介面窗口管理函數(shù)實(shí)現(xiàn)窗口的創(chuàng)建、移動(dòng)和修改功能系統(tǒng)服務(wù)函數(shù):實(shí)現(xiàn)與操作系統(tǒng)有關(guān)的多種功能圖形設(shè)備(GDI)函數(shù):實(shí)現(xiàn)與設(shè)備無(wú)關(guān)的圖形操作功能40

利用Windows

API函數(shù)編寫(xiě)Windows應(yīng)用程式必須首先瞭解以下內(nèi)容:(1)窗口的概念(2)事件驅(qū)動(dòng)的概念(3)句柄(4)消息41(1)窗口 一個(gè)應(yīng)用程式的窗口一般包含下列成分:窗口邊界工作區(qū)控制菜單框下拉菜單水準(zhǔn)滾動(dòng)條垂直滾動(dòng)條最大化按鈕最小化按鈕標(biāo)題欄42編寫(xiě)一個(gè)Windows應(yīng)用程式首先應(yīng)創(chuàng)建一個(gè)或多個(gè)窗口,隨後應(yīng)用程式的運(yùn)行過(guò)程即是窗口內(nèi)部、窗口與窗口之間、窗口與系統(tǒng)之間進(jìn)行數(shù)據(jù)處理與數(shù)據(jù)交換的過(guò)程。應(yīng)用程序與用戶之間交互的介面環(huán)境系統(tǒng)管理應(yīng)用程式的基本單位Win應(yīng)用程式基本的操作單元43Windows程式設(shè)計(jì)是針對(duì)事件或消息的處理進(jìn)行

消息是描述事件發(fā)生的資訊(如按下滑鼠或鍵盤)事件驅(qū)動(dòng)編程方法對(duì)於編寫(xiě)互動(dòng)式程式很有用處,它避免了死板的操作模式Windows程式的執(zhí)行順序取決於事件發(fā)生的順序,程式的執(zhí)行順序是由順序產(chǎn)生的消息驅(qū)動(dòng)的,但是消息的產(chǎn)生往往並不要求有次序之分。(2)事件驅(qū)動(dòng)

44常用句柄類型及其說(shuō)明句柄是一個(gè)4位元組長(zhǎng)的數(shù)值,用於標(biāo)識(shí)應(yīng)用程式中不同的對(duì)象和同類對(duì)象中不同的實(shí)例窗口按鈕圖示滾動(dòng)條輸出設(shè)備控制檔(3)句柄應(yīng)用程式通過(guò)句柄訪問(wèn)相應(yīng)的對(duì)象資訊HWND 窗口句柄 HDC 設(shè)備環(huán)境句柄HBITMAP 位圖句柄 HCURSOR 游標(biāo)句柄HICON 圖示句柄 HFONT 字體句柄HMENU 菜單句柄 HPEN 畫(huà)筆句柄HFILE 檔句柄 HBRUSH 畫(huà)刷句柄

HINSTANCE 當(dāng)前實(shí)例句柄45

Windows應(yīng)用程式利用Windows消息(Message)與應(yīng)用程式及系統(tǒng)進(jìn)行資訊交換。typedefstructtagMSG

{HWNDhwnd; 窗口句柄,為null,則可檢索所有駐留在消息佇列中的消息

UINTmessage;消息值,由Windows.h頭檔中的宏定義來(lái)標(biāo)識(shí)

WPARAMwParam; 包含有關(guān)消息的附加資訊,不同消息其值有所不同

LPARAMlParam;

DWORDtime;指定消息送至佇列的時(shí)間

POINTpt;指定消息發(fā)送時(shí)螢?zāi)挥螛?biāo)的位置,其數(shù)據(jù)類型POINT也是一個(gè)結(jié)構(gòu)體}MSG;消息號(hào):由事先定義好的消息名標(biāo)識(shí)字參數(shù)(wParam):用於提供消息的附加資訊長(zhǎng)字參數(shù)(lParam):用於提供消息的附加資訊消息附加資訊與具體消息號(hào)的值有關(guān),在Win中消息用結(jié)構(gòu)體MSG表示typedefstructtagPOINT{LONGx;

LONGy;}POINT;(4)消息46(4)消息

VC中存在幾種系統(tǒng)定義的消息分類,不同的首碼符號(hào)經(jīng)常用於消息宏識(shí)別消息附屬的分類,系統(tǒng)定義的消息宏首碼如下:BM 表示按鈕控制消息CB 表示組合框控制消息DM 表示默認(rèn)下壓式按鈕控制消息EM 表示編輯控制消息LB 表示列表框控制消息SBM 表示滾動(dòng)條控制消息WM 表示窗口消息窗口管理消息初始化消息輸入消息系統(tǒng)消息剪貼板消息控制處理消息控制通知消息滾動(dòng)條通知消息非用戶區(qū)消息MDI消息DDE消息應(yīng)用程式自定義的消息Windows編程常用消息47二、Windows應(yīng)用程式常用消息1.WM_LBUTTONDOWN:產(chǎn)生單擊滑鼠左鍵的消息此外,相似的消息還有:WM_LBUTTONUP:放開(kāi)滑鼠左鍵時(shí)產(chǎn)生;WM_RBUTTONDOWN:?jiǎn)螕艋笥益I時(shí)產(chǎn)生;WM_RBUTTONUP:放開(kāi)滑鼠右鍵時(shí)產(chǎn)生;WM_LBUTTONDBLCLK:雙擊滑鼠左鍵時(shí)產(chǎn)生;WM_RBUTTONDBLCLK:雙擊滑鼠右鍵時(shí)產(chǎn)生。lParam高位元組包含當(dāng)前游標(biāo)的Y座標(biāo)值低位元組包含當(dāng)前游標(biāo)的X座標(biāo)值wParam包含一整數(shù)值以標(biāo)識(shí)滑鼠鍵的按下?tīng)顟B(tài)MK_LBUTTON 按下滑鼠左鍵MK_MBUTTON 按下滑鼠中鍵MK_RBUTTON 按下滑鼠右鍵482.WM_KEYDOWN:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息

系統(tǒng)鍵是指實(shí)現(xiàn)系統(tǒng)操作的組合鍵,例如Alt與某個(gè)功能鍵的組合以實(shí)現(xiàn)系統(tǒng)菜單操作等。3.WM_CHAR:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息wParam為按鍵的ASCII碼lParam與WM_KEYDOWN的相同wParam:按下鍵的虛擬鍵碼,用以標(biāo)識(shí)按下或釋放的鍵lParam:記錄了按鍵的重複次數(shù)、掃描碼、轉(zhuǎn)移代碼、先前鍵的狀態(tài)等資訊。相似的消息還有WM_KEYUP,在放開(kāi)非系統(tǒng)鍵時(shí)產(chǎn)生如F1的虛擬鍵碼在Windows.h文件中定義為VK_F1494.WM_CREATE:由CreateWindow函數(shù)發(fā)出的消息wParam:未用lParam:包含一個(gè)指向CREATESTRUCT數(shù)據(jù)結(jié)構(gòu)的指針5.WM_CLOSE:關(guān)閉窗口時(shí)產(chǎn)生的消息wParam和lParam均未用。6.WM_DESTROY:由DestroyWiodow函數(shù)發(fā)出的消息wParam和lParam均未用。507.WM_QUIT:由PostQuitMessage函數(shù)發(fā)出的消息退出應(yīng)用程式時(shí)發(fā)出的消息wParam:含退出代碼,標(biāo)識(shí)程式退出運(yùn)行時(shí)的有關(guān)資訊1Param:未用8.WM_PAINT用戶區(qū)移動(dòng)或顯示用戶窗口改變大小程式通過(guò)滾動(dòng)條滾動(dòng)窗口下拉式菜單關(guān)閉並需要恢復(fù)被覆蓋的部分Windows清除對(duì)話框等對(duì)象,並需要恢復(fù)被覆蓋的部分均產(chǎn)生WM_PAINT消息51三、Windows中的事件驅(qū)動(dòng)程式設(shè)計(jì)啟動(dòng)輸入姓名輸入第一次測(cè)試成績(jī)輸入第二次測(cè)試成績(jī)輸入第三次測(cè)試成績(jī)計(jì)算平均成績(jī)結(jié)束過(guò)程驅(qū)動(dòng)方法計(jì)算平均成績(jī)啟動(dòng)消息處理結(jié)束輸入姓名輸入第一次成績(jī)輸入第二次成績(jī)輸入第三次成績(jī)計(jì)算平均成績(jī)事件驅(qū)動(dòng)方法計(jì)算平均成績(jī)52四、Windows應(yīng)用程式組成及編程步驟

1.

應(yīng)用程式的組成一個(gè)完整的Windows應(yīng)用程式通常由五種類型的檔組成。1.C語(yǔ)言根源程式檔2.頭檔 3.模組定義檔 4.資源描述檔 5.專案檔 532.根源程式組成結(jié)構(gòu)入口函數(shù)WinMain窗口函數(shù)WndProcWindows應(yīng)用程式構(gòu)成基本框架包含各種數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)與函數(shù)等1.所有應(yīng)用程式的入口,類似Main函數(shù),2.完成一系列的定義和初始化,並產(chǎn)生消息迴圈WinMain和WinProc是Windows應(yīng)用程式的主體54(1)WinMain函數(shù)三個(gè)基本的組成部分:函數(shù)說(shuō)明、初始化和消息迴圈功能註冊(cè)窗口類,建立窗口及執(zhí)行必要的初始化進(jìn)入消息迴圈,據(jù)接受的消息調(diào)用相應(yīng)的處理過(guò)程當(dāng)消息迴圈檢索到WM_QUIT時(shí)終止程式運(yùn)行WinMain函數(shù)WinMain函數(shù)說(shuō)明WinMain函數(shù)的說(shuō)明如下:intWINAPIWinMain(

HINSTANCEhThisInst, ∥應(yīng)用程式當(dāng)前實(shí)例句柄

HINSTANCehPrevInst, ∥應(yīng)用程式其他實(shí)例句柄

LPSTRlpszCmdLine, ∥指向程式命令行參數(shù)的指針

IntnCmdShow ∥應(yīng)用程式開(kāi)始執(zhí)行時(shí)窗口顯示方式的整數(shù)值標(biāo)識(shí))注意!Win是多任務(wù)管理的,同一應(yīng)用程式的多個(gè)窗口可能會(huì)同時(shí)存,Win系統(tǒng)對(duì)每個(gè)窗口的執(zhí)行稱為一個(gè)實(shí)例,並用一個(gè)實(shí)例句柄來(lái)唯一標(biāo)識(shí)55(2)初始化(a)窗口類定義

通過(guò)給窗口類數(shù)據(jù)結(jié)構(gòu)WNDCLASS賦值完成,該數(shù)據(jù)結(jié)構(gòu)中包含窗口類的各種屬性。窗口類定義常用以下函數(shù):LoadIcon的作用是在應(yīng)用程式中加載一個(gè)窗口圖示。其原型為:HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName)圖示資源名或系統(tǒng)預(yù)定義圖示標(biāo)識(shí)名圖示資源所在的模組句柄,NULL則使用系統(tǒng)預(yù)定義圖示初始化顯示窗口創(chuàng)建窗口實(shí)例窗口類的註冊(cè):窗口類必須先註冊(cè)後使用窗口類的定義:定義窗口的形式與功能LoadIconLoadCursorGetStockObjectRegisterClassCreateWindowShowWindow,UpdateWindow56LoadCursor的作用是在應(yīng)用程式中加載一個(gè)窗口游標(biāo)HCURSORLoadCursor(HINSTANCEhInstance, LPCTSTRlpCursorName)游標(biāo)資源所在的模塊句柄,NULL則使用系統(tǒng)預(yù)定義游標(biāo)游標(biāo)資源名或系統(tǒng)預(yù)定義游標(biāo)標(biāo)識(shí)名應(yīng)用程式調(diào)用函數(shù)GetStockObject獲取系統(tǒng)提供的背景刷HBRUSHGetStockObject(intnBrush);57(b)註冊(cè)窗口類Win系統(tǒng)本身提供部分預(yù)定義的窗口類,程式員也可以自定義窗口類,窗口類必須先註冊(cè)後使用。窗口類的註冊(cè)由函數(shù)RegisterClass()實(shí)現(xiàn)。

RegisterClass(&wndclass);//wndclass為窗口類結(jié)構(gòu)

RegisterClass函數(shù)的返回為布爾值,註冊(cè)成功則返回真58(c)創(chuàng)建窗口實(shí)例創(chuàng)建一個(gè)窗口類的實(shí)例由函數(shù)CreateWindow()實(shí)現(xiàn)函數(shù)原型如下:HWNDCreateWindow(

LPCTSTRlpszClassName,∥窗口類名

LPCTSTRlpszTitle, ∥窗口標(biāo)題名

DWORDdwStyle, ∥創(chuàng)建窗口的樣式

intx,y, ∥窗口左上角座標(biāo)

intnWidth,nHeight, ∥窗口寬度和度高

HWNDhwndParent, ∥該窗口的父窗口句柄

HMENUhMenu, ∥窗口主菜單句柄

HINSTANCEhInstance,∥創(chuàng)建窗口的應(yīng)用程式當(dāng)前句柄

LPVOIDlpParam ∥指向一個(gè)傳遞給窗口的參數(shù)值的指針

)5960(d)顯示窗口窗口類的顯示由ShowWindow和UpdateWindow函數(shù)實(shí)現(xiàn)。應(yīng)用程式調(diào)用ShowWindow函數(shù)在螢?zāi)簧巷@示窗口ShowWindow(hwnd,nCmdshow);//nCmdshow為窗口顯示形式標(biāo)識(shí)顯示窗口後,應(yīng)用程式調(diào)用UpdateWindow更新並繪製用戶區(qū),併發(fā)出WM_PAINT消息。

UpdateWindow(hwnd);61(3)消息迴圈消息迴圈的常見(jiàn)格式如下:MSGMsg;…while(GetMessage(&Msg,NULL,0,0)){

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}將消息的虛擬鍵轉(zhuǎn)換為字元資訊將消息傳送到指定窗口函數(shù)從消息佇列中讀取一條消息,並將消息放在MSG結(jié)構(gòu)中

其中函數(shù)GetMessage形式為:GetMessage(lpMSG, //指向MSG結(jié)構(gòu)的指針

hwnd,

nMsgFilteMin,//用於消息過(guò)濾的最小消息號(hào)值

nMsgFilterMax//用於消息過(guò)濾的最大消息號(hào)值)返回零值,即檢索到WM_QUIT消息,程序結(jié)束迴圈並退出將消息傳遞給窗口函數(shù)的相應(yīng)過(guò)程處理消息隊(duì)列Windows將產(chǎn)生的消息WinMain函數(shù)622.窗口函數(shù)WinProcWinProc函數(shù)由一個(gè)或多個(gè)switch語(yǔ)句組成。每一條case語(yǔ)句對(duì)應(yīng)一種消息,當(dāng)應(yīng)用程式接收到一個(gè)消息時(shí),相應(yīng)的case語(yǔ)句被啟動(dòng)並執(zhí)行相應(yīng)的回應(yīng)程式模組。WinProc包含了對(duì)各種可能接收到的消息的處理過(guò)程定義了應(yīng)用程式對(duì)接收到的不同消息的回應(yīng)63窗口函數(shù)的一般形式如下:LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessgae, WPARAMwParam,LPARAMlParam){

switch(message) ∥message為標(biāo)識(shí)的消息

{

case…

…break;

caseWM_DESTROY:

PostQuitMessage(0);

default:returnDefWindowProc(hwnd,message,wParam,lParam);

}return(0);}

在消息處理程式段中一般都有對(duì)WM_DESTROY的處理,該消息是關(guān)閉窗口時(shí)發(fā)出的。它向應(yīng)用程式發(fā)出WM_QUIT消息,請(qǐng)求退出處理函數(shù):

voidPostQuitMessage(intnExitCode)

//nExitCode為應(yīng)用程式的退出代碼為未定義處理過(guò)程的消息提供缺省處理643.?dāng)?shù)據(jù)類型

在Windows.h中定義了Windows

應(yīng)用程式中包含種類繁多的數(shù)據(jù)類型654.一些重要的數(shù)據(jù)結(jié)構(gòu)MSG:包含一個(gè)消息的全部資訊,是消息發(fā)送的格式WNDCLASS:包含一個(gè)窗口類的全部資訊及屬性POINT:定義了螢?zāi)簧匣虼翱谥械囊粋€(gè)點(diǎn)的X和Y座標(biāo)RECT:定義了一個(gè)矩形區(qū)域及其左上角和右下角的座標(biāo)幾種重要的結(jié)構(gòu)66五、應(yīng)用程式舉例【例2-1】創(chuàng)建應(yīng)用程式框架。本例的目的在於說(shuō)明創(chuàng)建Windows應(yīng)用程式的方法及過(guò)程#include<windows.h> //包含應(yīng)用程式中所需的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)的定義LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數(shù)說(shuō)明//以下初始化窗口類intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){

HWNDhwnd;

MSGMsg;

WNDCLASSwndclass;

charlpszClassName[]="窗口"; //窗口類名

charlpszTitle[]="My_Windows"; //窗口標(biāo)題名67

//窗口類的定義wndclass.style=0; //窗口類型為缺省類型wndclass.lpfnWndProc=WndProc; //定義窗口處理函數(shù)wndclass.cbClsExtra=0; //窗口類無(wú)擴(kuò)展wndclass.cbWndExtra=0; //窗口實(shí)例無(wú)擴(kuò)展wndclass.hInstance=hInstance; //當(dāng)前實(shí)例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化圖示為缺省圖示wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口採(cǎi)用箭頭游標(biāo)wndclass.hbrBackground=GetStockObject(WHITE_BRUSH); //窗口背景為白色wndclass.lpszMenuName=NULL; //窗口中無(wú)菜單wndclass.lpszClassName=lpszClassName; //窗口類名為"窗口"68

//以下進(jìn)行窗口類的註冊(cè)if(!RegisterClass(&wndclass))//如果註冊(cè)失敗則發(fā)出警告

{

MessageBeep(0);

returnFALSE;

}//創(chuàng)建窗口

hwnd=CreateWindow (

lpszClassName, //窗口類名

lpszTitle, //窗口實(shí)例的標(biāo)題名

WS_OVERLAPPEDWINDOW, //窗口的風(fēng)格

CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角座標(biāo)為缺省值

CW_USEDEFAULT, CW_USEDEFAULT,, //窗口的高和寬為缺省值

NULL, //此窗口無(wú)父窗口

NULL, //此窗口無(wú)主菜單

hInstance, //創(chuàng)建此窗口的應(yīng)用程式的當(dāng)前句柄

NULL //不使用該值

);69//顯示窗口ShowWindow(hwnd,nCmdShow);//繪製用戶區(qū)UpdateWindow(hwnd);//消息循環(huán)

while(GetMessage(&Msg,NULL,0,0))

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}returnMsg.wParam; //消息迴圈結(jié)束即程式終止時(shí)將資訊返回系統(tǒng)}1.GDI的一些基本概念

設(shè)備描述表即為設(shè)備環(huán)境的屬性的集合應(yīng)用程式與輸出設(shè)備之間的橋樑Win系統(tǒng)外設(shè)直接訪問(wèn)不允許統(tǒng)一的設(shè)備環(huán)境(DC)提供使應(yīng)用程式與設(shè)備相連用戶為確保圖形輸出的設(shè)備無(wú)關(guān)性應(yīng)用程式設(shè)備描述表及其屬性通過(guò)設(shè)備描述表的句柄來(lái)間接地存取應(yīng)用程式每一次圖形操作均參照設(shè)備描述表中的屬性執(zhí)行2.圖形刷新圖形刷新是繪圖過(guò)程中必須考慮的重要問(wèn)題刷新請(qǐng)求對(duì)刷新請(qǐng)求的回應(yīng)刷新方法包括(1)刷新請(qǐng)求

應(yīng)用程式在窗口中繪製了一個(gè)橢圓,顏色列表框覆蓋了橢圓的一部分關(guān)閉顏色選框後,應(yīng)用程式需要恢複被覆蓋部分的顏色和形狀窗口大小的調(diào)整窗口移動(dòng)被覆蓋後的恢復(fù)(2)系統(tǒng)對(duì)刷新請(qǐng)求的回應(yīng)

當(dāng)用戶區(qū)的內(nèi)容需要刷新時(shí),系統(tǒng)向應(yīng)用程式消息佇列發(fā)送WM_PAINT消息,系統(tǒng)在應(yīng)用程式的消息佇列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理三種刷新窗口移動(dòng)後的刷新被覆蓋區(qū)域的刷新對(duì)象穿越後的刷新(系統(tǒng)自動(dòng)完成)用戶區(qū)移動(dòng)或顯示用戶窗口大小改變程式通過(guò)滾動(dòng)條滾動(dòng)窗口窗口被另一個(gè)窗口覆蓋的恢復(fù)如下拉式菜單關(guān)閉等游標(biāo)穿過(guò)用戶區(qū)圖示拖過(guò)用戶區(qū)窗口被另一個(gè)窗口覆蓋的區(qū)域稱為無(wú)效區(qū)域。

Windows系統(tǒng)為每個(gè)窗口建立了一個(gè)PAINTSTRUCT結(jié)構(gòu),該結(jié)構(gòu)中包含了包圍無(wú)效區(qū)域的一個(gè)最小矩形的結(jié)構(gòu)RECT,應(yīng)用程式可以根據(jù)這個(gè)無(wú)效矩形執(zhí)行刷新操作。

typedefstructtagPAINTSTRUCT{HDChdc; //設(shè)備環(huán)境句柄

BOOLfErase; //一般取真值,表示擦除無(wú)效矩形的背景

RECTrcPaint; //無(wú)效矩形標(biāo)識(shí)

BOOLfRestore; //系統(tǒng)保留

BOOLfIncUpdate; //系統(tǒng)保留

BYTErgbReserved[32];//系統(tǒng)保留

}PAINTSTRUCT;rcPaint為標(biāo)準(zhǔn)的RECT數(shù)據(jù)結(jié)構(gòu),其作用是標(biāo)識(shí)無(wú)效矩形,它包含了無(wú)效矩形的左上角和右下角的座標(biāo)常用的Windows應(yīng)用程式刷新窗口的方法保存副本。刷新時(shí)將副本拷貝到相應(yīng)的窗口中記錄事件。刷新時(shí)重新執(zhí)行這個(gè)曾經(jīng)發(fā)生的事件重新繪製。將圖形繪製處理程式放在消息WM_PAINT回應(yīng)模組中,刷新時(shí)重繪圖形(3)有效的刷新方法3.獲取設(shè)備環(huán)境的方法獲取設(shè)備環(huán)境是應(yīng)用程式輸出圖形的先決條件,常用的兩種方法是調(diào)用函數(shù)BeginPaint或GetDC(1)調(diào)用BeginPaint函數(shù)

應(yīng)用程式回應(yīng)WM_PAINT消息進(jìn)行圖形刷新時(shí),主要通過(guò)調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境

hdc=BeginPaint(hwnd,&ps);//ps為PAINTSTRUCT類型結(jié)構(gòu)定義方式為:PAINTSTRUCTps;

系統(tǒng)獲取設(shè)備環(huán)境的同時(shí)填寫(xiě)ps結(jié)構(gòu),以標(biāo)識(shí)無(wú)效矩形區(qū)由BeginPaint函數(shù)獲取的設(shè)備環(huán)境要用EndPaint函數(shù)釋放BOOLEndPaint(HWNDhwnd,PAINTSTRUCT&ps)(2)調(diào)用GetDC函數(shù)

如果繪圖工作並非由WM_PAINT消息驅(qū)動(dòng),則調(diào)用GetDC函數(shù)獲取設(shè)備環(huán)境。hdc=GetDC(hwnd);

由GetDC函數(shù)獲取的設(shè)備環(huán)境必須用ReleaseDC函數(shù)釋放

voidReleaseDC(HWNDhwnd);4.映像模式 映像模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備的x方向和y方向,程式員可在一個(gè)統(tǒng)一的邏輯坐標(biāo)系中操作而不必考慮輸出設(shè)備的坐標(biāo)系情況窗口:對(duì)應(yīng)邏輯坐標(biāo)系上程式員設(shè)定的區(qū)域視口:對(duì)應(yīng)實(shí)際輸出設(shè)備上程式員設(shè)定的區(qū)域窗口和視口如何映射?缺省的映射模式將窗口中的對(duì)稱圖形映射到視口時(shí)仍為對(duì)稱圖形按照窗口和視口的座標(biāo)比例進(jìn)行映射坐標(biāo)系統(tǒng)邏輯坐標(biāo)系統(tǒng)設(shè)備坐標(biāo)系統(tǒng)螢?zāi)蛔鴺?biāo)系統(tǒng)窗口坐標(biāo)系統(tǒng)用戶區(qū)坐標(biāo)系統(tǒng)

應(yīng)用程式可獲取設(shè)備環(huán)境的當(dāng)前映像模式,並根據(jù)需要設(shè)置映像模式。相關(guān)函數(shù)設(shè)置設(shè)備環(huán)境的映像模式SetMapMode(hdc,nMapMode);

nMapMode為映像模式的整型識(shí)別字獲取當(dāng)前設(shè)備環(huán)境的映像模式nMapMode=GetMapMode(hdc);窗口區(qū)域的定義由SetWindowExtEx函數(shù)完成,其函數(shù)原型形為:BOOLSetWindowExtEx(HDChdc, intnHeight,nWidth,//以邏輯單位表示的窗口區(qū)域高寬度

LPSIZElpSize,//函數(shù)調(diào)用前窗口區(qū)域尺寸的SIZE結(jié)構(gòu)地址);視口區(qū)域的定義由SetViewportExtEx函數(shù)完成,函數(shù)原型為:BOOLSetViewportExtEx(HDChdc, intnHeight,nWidth,//以物理設(shè)備單位表示的新視口區(qū)域高寬度LPSIZElpSize );只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時(shí)才有意義視口的缺省原點(diǎn)和窗口的缺省原點(diǎn)均為(0,0)??赏ㄟ^(guò)調(diào)用函數(shù)SetViewportOrgEx和SetWindowOrgEx設(shè)定窗口與視口的原點(diǎn)。SetWindowOrgEx函數(shù)的原形為:BOOLSetWindowOrgEx(HDChdc,intX,Y, //以邏輯單位表示的窗口原點(diǎn)座標(biāo)LPPOINTlpPoint //函數(shù)調(diào)用前原點(diǎn)座標(biāo)的POINT結(jié)構(gòu)的地址);只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時(shí)才有意義二、繪圖工具與顏色1.畫(huà)筆(1)畫(huà)筆的創(chuàng)建使用畫(huà)筆之前必須事先定義一個(gè)畫(huà)筆句柄。形式如下:HPENhP;然後調(diào)用函數(shù)GetStockObject獲取Windows系統(tǒng)定義的四種畫(huà)筆例如獲取畫(huà)筆BLACK_PEN的形式如下:

hP=GetStockObject(BLACK_PEN);WHITE_PENBLACK_PENDC_PENNULL_PEN畫(huà)筆的操作創(chuàng)建畫(huà)筆將畫(huà)筆選入設(shè)備環(huán)境刪除畫(huà)筆(2)創(chuàng)建新畫(huà)筆,形式如下:hP=CreatePen(intnPenStyle, //確定畫(huà)筆樣式intnWidth, //畫(huà)筆寬度COLORREFrgbColor//畫(huà)筆顏色);創(chuàng)建畫(huà)筆後,必須調(diào)用SelectObject函數(shù)將其選入設(shè)備環(huán)境。

SelectObject(hdc,hP);//hP為所創(chuàng)建或獲取的畫(huà)筆句柄不再使用當(dāng)前畫(huà)筆時(shí),需刪除畫(huà)筆,以免占記憶體

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

HBRUSHhBr;//hBr為畫(huà)刷句柄

然後調(diào)用函數(shù)GetStockObject獲取Windows系統(tǒng)提供的7種畫(huà)刷

hBr=(HBRUSH)GetStockObject(nBrushStyle)畫(huà)刷樣式BLACK_BRUSH 黑色畫(huà)刷DKGRAY_BRUSH 深灰色畫(huà)刷GRAY_BRUSH 灰色畫(huà)刷HOLLOW_BRUSH 虛畫(huà)刷LTGRAY_BRUSH 亮灰色畫(huà)刷NULL_BRUSH 空畫(huà)刷 WHITE_BRUSH 白色畫(huà)刷指定顏色畫(huà)刷如何獲得?可調(diào)用函數(shù)CreateSolidBrush和CreateHatchBrush創(chuàng)建畫(huà)刷,hBr=CreateSolidBrush(rgbColor);

創(chuàng)建具有指定顏色的單色畫(huà)刷創(chuàng)建指定陰影圖案和顏色的畫(huà)刷(2)選入設(shè)備環(huán)境

創(chuàng)建畫(huà)刷後,通過(guò)SelectObject(hdc,hBr);將其選入設(shè)備環(huán)境(3)刪除畫(huà)刷不使用畫(huà)刷時(shí),可用DeleteObject(hBr);刪除畫(huà)刷,釋放記憶體hBr=CreateHatchBrush(intnHctchStyle,COLORREFrgbColor );HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS 垂直相交的陰影線HS_HORIZONTAL水準(zhǔn)陰影線HS_VERTICAL 垂直陰影線3.顏色

Windows使用宏RGB定義繪圖的顏色,其形式為:

RGB(nRed,nGreen,nBlue)

紅色值藍(lán)色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)三、常用繪圖函數(shù)1.設(shè)置畫(huà)筆當(dāng)前位置的函數(shù)MoveToEx,

BOOLMoveToEx(HDChdc,intX,Y, //X、Y分別為新位置的邏輯座標(biāo)

LPPOINTlpPoint //存放原畫(huà)筆位置的POINT結(jié)構(gòu)地址)2.從當(dāng)前位置向指定座標(biāo)點(diǎn)畫(huà)直線的函數(shù)LineToEx,BOOLLineToEx(HDChdc,intX,intY)//X和Y為線段的終點(diǎn)座標(biāo)3.從當(dāng)前位置開(kāi)始,依次用線段連接lpPoints中指定的各點(diǎn)BOOLPolyline(HDChdc,LPPOINTlpPoints,//指向包含各點(diǎn)座標(biāo)的POINT結(jié)構(gòu)數(shù)組的指針

intnCount //nCount為POINT數(shù)組中點(diǎn)的個(gè)數(shù))4.繪製橢圓弧線的函數(shù)Arc,BOOLArc(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯座標(biāo)intX2,intY2, //邊框矩形右下角的邏輯座標(biāo)intX3,intY3, //橢圓弧起始點(diǎn)座標(biāo)intX4,intY4 //橢圓弧終止點(diǎn)座標(biāo))(x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫(huà)曲線5.繪製餅圖,並用當(dāng)前畫(huà)刷進(jìn)行填充BOOLPie(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯座標(biāo)intX2,intY2, //邊框矩形右下角的邏輯座標(biāo)intX3,intY3, //橢圓弧起始經(jīng)線的確定點(diǎn)座標(biāo)intX4,intY4 //橢圓弧終止經(jīng)線的確定點(diǎn)座標(biāo))(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區(qū)域6.繪製矩形,並用當(dāng)前畫(huà)刷進(jìn)行填充BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2)(X1,Y1)和(X2,Y2)分別為矩形的左上角和右下角的邏輯座標(biāo)7.繪製圓角矩形,並用當(dāng)前畫(huà)刷填充BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,

intnHeight,intnWidth)圓角的高度和寬度8.繪製橢圓,並用當(dāng)前畫(huà)刷填充

BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)9.繪製多邊形,並用當(dāng)前畫(huà)刷填充

BOOLPolygon(HDChdc,LPPOINTlpPoints,intnCount)包含各點(diǎn)座標(biāo)的POINT數(shù)組的地址多邊形點(diǎn)的個(gè)數(shù)四、應(yīng)用實(shí)例【例4-1】利用繪圖函數(shù)創(chuàng)建填充區(qū)。共有三個(gè)填充圖形,第一個(gè)是用深灰色畫(huà)刷填充帶圓角的矩形,第二個(gè)是採(cǎi)用亮灰色畫(huà)刷填充一個(gè)橢圓型圖,第三個(gè)是用虛畫(huà)刷填充餅形圖。#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc ( HWNDhWnd, UINTiMessage, UINTwParam, LONGlParam );使用虛畫(huà)刷填充時(shí),看不出填充效果!!!BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);intWINAPIWinMain //主函數(shù)

(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnCmdShow){ MSGMessage; if(!InitWindowsClass(hInstance)) returnFALSE; if(!InitWindows(hInstance,nCmdShow)) returnFALSE;

while(GetMessage(&Message,0,0,0)) //消息迴圈

{ TranslateMessage(&Message); DispatchMessage(&Message); } returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam){HDChDC; //定義指向設(shè)備的句柄

HBRUSHhBrush; //定義指向畫(huà)刷的句柄

HPENhPen; //定義指向畫(huà)筆的句柄

PAINTSTRUCTPtStr;//定義指向包含繪圖資訊的結(jié)構(gòu)體變數(shù)消息處理函數(shù)switch(iMessage) //處理消息{caseWM_PAINT:

//處理繪圖消息

hDC=BeginPaint(hWnd,&PtStr);

SetMapMode(hDC,MM_ANISOTROPIC);//設(shè)置映像模式

hPen=(HPEN)GetStockObject(BLACK_PEN); //黑色畫(huà)筆

hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//畫(huà)刷

SelectObject(hDC,hBrush);//選擇畫(huà)刷

SelectObject(hDC,hPen);//選擇畫(huà)筆

RoundRect(hDC,50,120,100,200,15,15);//繪製圓角矩形

hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//採(cǎi)用亮灰色畫(huà)刷下麵只改變畫(huà)刷,不改變筆SelectObject(hDC,hBrush); //選擇畫(huà)刷

Ellipse(hDC,150,50,200,150); //繪製橢圓

hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//虛畫(huà)刷

SelectObject(hDC,hBrush); //選擇畫(huà)刷

Pie(hDC,250,50,300,100,250,50,300,50); //繪製餅形

EndPaint(hWnd,&PtStr); //結(jié)束繪圖

return0;caseWM_DESTROY:

//結(jié)束應(yīng)用程式

PostQuitMessage(0);return0;default: //其他消息處理程式

return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{ HWNDhWnd;

hWnd=CreateWindow("WinFill",//生成窗口

"填充示例程式", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //顯示窗口

UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定義窗口類{WNDCLASSWndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=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_VREDRAW;returnRegisterClass(&WndClass);}例4-2:應(yīng)用畫(huà)筆和畫(huà)刷等工具繪製如圖所示的圖形1…#include<windows.h>2…#include<stdlib.h>3…#include<string.h>4…

longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);5…BOOLInitWindowsClass(HINSTANCEhInstance);6…BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);7…//主函數(shù)8…intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)9…{ MSGMessage;10… if(!InitWindowsClass(hInstance)) returnFALSE;11… if(!InitWindows(hInstance,nCmdShow)) returnFALSE;12… while(GetMessage(&Message,0,0,0)) //消息迴圈13… { TranslateMessage(&Message);14… DispatchMessage(&Message);}15… returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)1…{HDChDC; //定義設(shè)備環(huán)境句柄2…HBRUSHhBrush; //定義畫(huà)刷的句柄3…HPENhPen; //定義畫(huà)筆的句柄4…PAINTSTRUCTPtStr; //定義指向包含繪圖資訊的結(jié)構(gòu)體變數(shù)

//定義一個(gè)POINT數(shù)組,包括6個(gè)點(diǎn)

5…POINTpoints[6]={{100,212},{70,227},{70,250},{130,250},{130,227},{100,212}};6…switch(iMessage) //處理消息

7…{caseWM_PAINT: //處理繪圖消息

8… hDC=BeginPaint(hWnd,&PtStr);9… hPen=(HPEN)GetStockObject(NULL_PEN);//獲取系統(tǒng)定義的空畫(huà)筆10… SelectObject(hDC,hPen); //選擇畫(huà)筆11… hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);//獲取系統(tǒng)定義的畫(huà)刷12… SelectObject(hDC,hBrush); //選擇畫(huà)刷13… LineTo(hDC,50,50); //畫(huà)線14… DeleteObject(hPen); //刪除畫(huà)筆15… hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));//創(chuàng)建畫(huà)筆16… SelectObject(hDC,hPen); //選擇畫(huà)筆

//畫(huà)一個(gè)三角形17… LineTo(hDC,150,50);18… LineTo(hDC,100,137);19… LineTo(hDC,50,50);1… Polyline(hDC,points,6); //畫(huà)一個(gè)五邊形2… Arc(hDC,63,137,138,212,100,137,100,137); //畫(huà)一個(gè)圓3… Pie(hDC,213,137,288,212,240,137,260,137); //畫(huà)一個(gè)圓餅4… Rectangle(hDC,213,212,287,250); //畫(huà)一個(gè)長(zhǎng)方形5… RoundRect(hDC,213,100,287,137,20,20);//畫(huà)一個(gè)圓角長(zhǎng)方形6… DeleteObject(hPen);//刪除畫(huà)筆7… DeleteObject(hBrush);//刪除畫(huà)刷8… EndPaint(hWnd,&PtStr);//結(jié)束繪圖9… return0;10…caseWM_DESTROY://結(jié)束應(yīng)用程式11… PostQuitMessage(0);12… return0;13…default://其他消息處理程式14… return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{ HWNDhWnd; hWnd=CreateWindow("WinFill", //生成窗口

"填充示例程式", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //顯示窗口

UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定義窗口類{WNDCLASSWndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=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_VREDRAW;returnRegisterClass(&WndClass);}【例4-3】設(shè)置映射與使用映射模式。程式的初始階段按模式MM_TEXT繪圖,用戶單擊滑鼠以改變映射模式,單擊左鍵,產(chǎn)生WM_LBUTTONDOWN消息,通知應(yīng)用程式設(shè)置映射模式為ISOTROPIC,並調(diào)用InvalidateRect函數(shù)刷新用戶區(qū),在用戶單擊滑鼠右鍵時(shí),產(chǎn)生WM_RBUTTONDOWN消息,應(yīng)用程式將映射模式設(shè)置成ANSIOTROPIC,同時(shí)刷新用戶區(qū)。LRESULTCALLBACKWndProc(…,…,…,…){HDChdc;PAINTSTRUCTps;HBRUSHhB1,hB2;switch(message){caseWM_LBUTTONDOWN: //單擊滑鼠左鍵的消息

nMode=MM_ISOTROPIC; //更改映射模式為MM_ISOTROPIC InvalidateRect(hwnd,NULL,1); //刷新用戶區(qū)

break;caseWM_RBUTTONDOWN: //單擊滑鼠右鍵消息

nMode=MM_ANISOTROPIC; //更改顯示模式為MM_ANISOTROPIC InvalidateRect(hwnd,NULL,1); //刷新用戶區(qū)

break;caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); //取得設(shè)備環(huán)境句柄

SetMapMode(hdc,nMode); //設(shè)置映射模式

SetWindowExtEx(hdc,150,150,NULL); //設(shè)置窗口區(qū)域

SetViewportExtEx(hdc,150,100,NULL); //設(shè)置視口區(qū)域

SetViewportOrgEx(hdc,150,60,NULL); //設(shè)置視口原點(diǎn)

hB1=(HBRUSH)GetStockObject(WHITE_BRUSH);//定義白色畫(huà)刷

hB2=(HBRUSH)GetStockObject(BLACK_BRUSH);//定義黑色畫(huà)刷

SelectObject(hdc,hB1); //將黑白刷選入設(shè)備環(huán)境

RoundRect(hdc,0,0,150,150,30,30); //繪製圓角矩形並填充

SelectObject(hdc,hB2); //更改當(dāng)前畫(huà)刷為黑色畫(huà)刷

Ellipse(hdc,0,10,150,140); //繪製橢圓並填充

EndPaint(hwnd,&ps); //釋放設(shè)備環(huán)境句柄

DeleteObject(hB1); //刪除畫(huà)刷句柄

DeleteObject(hB2); break;caseWM_DESTROY: PostQuitMessage(0); break;default: returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}【例4-4】編寫(xiě)一個(gè)程式,在螢?zāi)簧铣霈F(xiàn)一個(gè)圓心沿正弦曲線軌跡移動(dòng)的實(shí)心圓,而且,每隔四分之一週期,圓的填充色和圓的周邊顏色都發(fā)生變化,同時(shí),圓的半徑在四分之一週期之內(nèi)由正弦曲線幅值的0.2倍至0.6倍線性增長(zhǎng)。(1)正弦曲線是此題的基礎(chǔ)。在WndMain()函數(shù)消息迴圈前,生成正弦曲線各點(diǎn)的座標(biāo)。把正弦曲線一個(gè)週期的橫坐標(biāo)分成100個(gè)等分點(diǎn),存儲(chǔ)在數(shù)組lpSin[100]中,100個(gè)點(diǎn)的座標(biāo)計(jì)算如下:for(intj=0;j<100;j++) //生成正弦曲線的點(diǎn)座標(biāo)

{ lpSin[j].x=(long)(j*2*Pi/100*60); lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));}(2)動(dòng)態(tài)顯示圓在正弦曲線上移動(dòng)數(shù)組lpSin[100]的長(zhǎng)度為100設(shè)定圓在正弦曲線移動(dòng)時(shí)共有100個(gè)位置數(shù)組中每一個(gè)值是圓移動(dòng)時(shí)圓心的座標(biāo)每四分之一週期有25個(gè)位置i<=25 處?kù)兜?個(gè)1/4週期,創(chuàng)建紅色畫(huà)筆和畫(huà)刷;25<i<50 處?kù)兜?個(gè)1/4週期,創(chuàng)建綠色畫(huà)筆和畫(huà)刷;50<i<75 處?kù)兜?個(gè)1/4週期,創(chuàng)建藍(lán)色畫(huà)筆和畫(huà)刷;75<i<100 處?kù)兜?個(gè)1/4週期,創(chuàng)建黃色畫(huà)筆和畫(huà)刷;if(i<=25) //第一個(gè)1/4週期{hPen=CreatePen(PS_DASH,1,RGB(255,0,0));

hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計(jì)算半徑}在消息WM_PAINT處理程式中,調(diào)用函數(shù)BeginPaint()獲得設(shè)備環(huán)境句柄。由此經(jīng)過(guò)線性差分計(jì)算圓半徑的大小lRadious,第1個(gè)1/4週期的程式代碼如下:創(chuàng)建的畫(huà)筆和畫(huà)刷選入設(shè)備環(huán)境後,調(diào)用函數(shù)Ellipse(…)繪製圓形下麵這段代碼是動(dòng)態(tài)顯示的關(guān)鍵:

Sleep(100); //停0.1秒

if(i<100)InvalidateRect(hWnd,NULL,1);//刷新用戶區(qū)調(diào)用Sleep(100)函數(shù)使程式暫停0.1秒。所含參數(shù)100代表暫停的時(shí)間,使用毫秒作單位。i<100時(shí)調(diào)用函數(shù)刷新用戶區(qū)發(fā)送WM_PAINT消息消息發(fā)到的窗口的句柄代表刷新整個(gè)用戶區(qū)代表清除用戶區(qū)中所有的顯示內(nèi)容#include<windows.h>#include<stdlib.h>#include<string.h>#include<math.h>#definePi3.1415926longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam);doubledfTheta=0,dfRange=100.0; //正弦曲線的角度變數(shù).longi=0,j=0;longlCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange); //定義圓心座標(biāo)和圓半徑.POINTlpSin[100]; //定義正弦曲線的點(diǎn)座標(biāo).intWINAPIWinMain(…,…,…,...){ ……//填寫(xiě)窗口類屬性

if(!RegisterClass(&WndClass)) //註冊(cè)窗口. { MessageBeep(0); returnFALSE;}hWnd=CreateWindow ("SIN", //窗口類名. "4_6", //標(biāo)題名.

WS_OVERLAPPEDWINDOW, //帶標(biāo)題欄,最大/小按鈕的窗口

CW_USEDEFAULT, //窗口左上角座標(biāo). 0, CW_USEDEFAULT, //採(cǎi)用缺省的寬度和高度. 0, NULL

溫馨提示

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