CWindows程序設(shè)計(jì)基礎(chǔ)實(shí)用_第1頁(yè)
CWindows程序設(shè)計(jì)基礎(chǔ)實(shí)用_第2頁(yè)
CWindows程序設(shè)計(jì)基礎(chǔ)實(shí)用_第3頁(yè)
CWindows程序設(shè)計(jì)基礎(chǔ)實(shí)用_第4頁(yè)
CWindows程序設(shè)計(jì)基礎(chǔ)實(shí)用_第5頁(yè)
已閱讀5頁(yè),還剩82頁(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)介

會(huì)計(jì)學(xué)1CWindows程序設(shè)計(jì)基礎(chǔ)實(shí)用210.1Windows程序設(shè)計(jì)基礎(chǔ)Windows系統(tǒng)的特點(diǎn)標(biāo)準(zhǔn)的用戶界面多任務(wù)設(shè)備獨(dú)立性動(dòng)態(tài)鏈接強(qiáng)大的內(nèi)存管理第1頁(yè)/共87頁(yè)310.1Windows程序設(shè)計(jì)基礎(chǔ)2.基本術(shù)語(yǔ)窗口(Window)由句柄唯一標(biāo)識(shí)對(duì)話框(Dialog)人機(jī)交互圖標(biāo)(Icon)代表某一項(xiàng)操作或程序的圖符位圖(Bitmap)用位模式形成的圖像菜單(Menu)命令工具欄(ToolBar)常用的菜單項(xiàng)狀態(tài)欄(StateBar)操作狀態(tài)或操作提示第2頁(yè)/共87頁(yè)410.1.1窗口窗口是Windows程序的基本單元,Windows程序的運(yùn)行過(guò)程就是窗口內(nèi)部、窗口之間及窗口與用戶之間的信息交換過(guò)程。窗口通常包括菜單、工具條、滾動(dòng)條、狀態(tài)欄、命令按鈕、對(duì)話框等元素。第3頁(yè)/共87頁(yè)510.1.2事件驅(qū)動(dòng)和消息響應(yīng)1.事件事件是指人們應(yīng)用計(jì)算機(jī)的過(guò)程中發(fā)生的操作,如按下鍵盤上的某個(gè)按鍵、移動(dòng)鼠標(biāo)、單擊鼠標(biāo)左鍵、移動(dòng)窗口及選擇程序菜單等操作都是事件。2、事件驅(qū)動(dòng)每發(fā)生一個(gè)事件,就會(huì)產(chǎn)生一個(gè)與之對(duì)應(yīng)的特定消息,該消息會(huì)被Windows系統(tǒng)捕獲,然后將通過(guò)此消息調(diào)用執(zhí)行與之對(duì)應(yīng)的程序代碼,實(shí)現(xiàn)相應(yīng)的程序功能。因?yàn)閺氖录l(fā)生到相應(yīng)程序代碼被調(diào)用執(zhí)行都是通過(guò)消息來(lái)實(shí)現(xiàn)的,因此事件驅(qū)動(dòng)也常被稱為消息驅(qū)動(dòng)第4頁(yè)/共87頁(yè)610.1.2事件驅(qū)動(dòng)和消息響應(yīng)3、消息隊(duì)列用于存放消息的隊(duì)列,消息系統(tǒng)由Windows系統(tǒng)自動(dòng)建立和維護(hù)。Windows消息隊(duì)列的類型系統(tǒng)消息隊(duì)列:由Windows系統(tǒng)維護(hù)管理的消息隊(duì)列,每當(dāng)有消息發(fā)生時(shí),該消息將首先被存入系統(tǒng)消息隊(duì)列。應(yīng)用程序消息隊(duì)列:Windows系統(tǒng)會(huì)為每個(gè)應(yīng)用程序建立一個(gè)獨(dú)立的消息隊(duì)列,用于存放該應(yīng)用程序的消息。第5頁(yè)/共87頁(yè)710.1.2事件驅(qū)動(dòng)和消息響應(yīng)4、消息循環(huán)每個(gè)應(yīng)用程序都有一個(gè)循環(huán)機(jī)構(gòu),該循環(huán)機(jī)構(gòu)則不斷地重復(fù)查看程序自身的消息隊(duì)列,如果隊(duì)列中有消息,就將其取出并執(zhí)行相應(yīng)的消息處理代碼,這個(gè)處理消息的循環(huán)機(jī)構(gòu)稱為消息循環(huán)。

第6頁(yè)/共87頁(yè)810.1.2事件驅(qū)動(dòng)和消息響應(yīng)5、Windows程序調(diào)度的基本原理每個(gè)Windows程序啟動(dòng)后,就等待用戶在其窗口中進(jìn)行操作。每個(gè)操作會(huì)引發(fā)一個(gè)事件,就會(huì)產(chǎn)生一個(gè)與之對(duì)應(yīng)的特定消息。該消息會(huì)被Windows系統(tǒng)捕獲。Windows系統(tǒng)對(duì)捕獲的消息進(jìn)行分析后,會(huì)將消息傳遞給產(chǎn)生它的應(yīng)用程序的消息隊(duì)列,每個(gè)應(yīng)用程序的消息循環(huán)機(jī)構(gòu)不斷地重復(fù)查看它自已的消息隊(duì)列,如果隊(duì)列中有消息,就將其取出并執(zhí)行相應(yīng)的消息處理代碼,如果隊(duì)列中沒(méi)有消息就等待,當(dāng)隊(duì)列中有消息時(shí)就又處理它,如此循環(huán)往復(fù),直至程序結(jié)束。第7頁(yè)/共87頁(yè)910.1.2事件驅(qū)動(dòng)和消息響應(yīng)6、事件驅(qū)動(dòng)及消息循環(huán)的基本原理第8頁(yè)/共87頁(yè)1010.1.2事件驅(qū)動(dòng)和消息響應(yīng)7、DOS和Windows程序執(zhí)行方式對(duì)比第9頁(yè)/共87頁(yè)1110.1.3Windows程序的構(gòu)成1、Windows程序的組成程序代碼程序代碼是程序的主體,用于實(shí)現(xiàn)程序的功能資源Windows程序具有標(biāo)準(zhǔn)規(guī)范的應(yīng)用程序界面,每個(gè)Windows程序常常包含了許多相同的組成元素,如菜單、對(duì)話框、工具欄、應(yīng)用程序圖標(biāo)、鼠標(biāo)光標(biāo)、程序版本信息等,這些組成元素被Windows從程序代碼中獨(dú)立出來(lái),并以各種不同擴(kuò)展名的文件形式存在,如.ico(圖標(biāo))、.bmp(位圖)、.cur(光標(biāo))等,Windows系統(tǒng)稱之為資源資源則可以在需要時(shí)才通過(guò)相關(guān)命令加載到程序中。第10頁(yè)/共87頁(yè)12.libCruntimeDllimport.RC資源編譯器.DLGDialogEditor*.obj*.exe.res.DEF資源連接器ImageEditorFontEditor.BMP.ICO.CUR.FON.h.c/cppc編譯器2、Window程序的編譯鏈接過(guò)程第11頁(yè)/共87頁(yè)1310.1.4VC++的Windows程序設(shè)計(jì)方法1.API程序設(shè)計(jì)API即ApplicationProgrammingInterface(應(yīng)用程序編程接口),它是Windows操作系統(tǒng)和Windows應(yīng)用程序之間的標(biāo)準(zhǔn)接口,在應(yīng)用程序中可以通過(guò)API訪問(wèn)Windows提供的各種函數(shù)、宏及數(shù)據(jù)結(jié)構(gòu)。API函數(shù)保存在一些動(dòng)態(tài)鏈接庫(kù)中,每個(gè)Windows程序都要用到的動(dòng)態(tài)鏈接庫(kù)有USER32.Dll、GDI32.Dll、KERNEL32.Dll。API程序設(shè)計(jì)就是直接利用Windows系統(tǒng)提供的API函數(shù),編寫能夠在Windows系統(tǒng)中運(yùn)行的程序。第12頁(yè)/共87頁(yè)1410.1.4VC++的Windows程序設(shè)計(jì)方法2.MFC程序設(shè)計(jì)MFC是MicrosoftFoundationClasses的縮寫,即微軟基礎(chǔ)類庫(kù)。MFC是建立在API基礎(chǔ)上的C++類庫(kù),它對(duì)Windows提供的API函數(shù)、數(shù)據(jù)結(jié)構(gòu)、各種控件按功能進(jìn)行了分類,利用面向?qū)ο蠹夹g(shù)將它們封裝在不同的類中,并通過(guò)繼承將這些類組織在一起。MFC不僅把API函數(shù)封裝成了易于使用的類,而且還提供了建立Windows應(yīng)用程序的框架結(jié)構(gòu),以及建立應(yīng)用程序的各種組件,簡(jiǎn)化了Windows程序設(shè)計(jì)的難度。

第13頁(yè)/共87頁(yè)151.句柄句柄是整個(gè)Windows編程的基礎(chǔ)。一個(gè)句柄是指Windows使用的一個(gè)唯一的整數(shù)值,是一個(gè)4字長(zhǎng)(32位無(wú)符號(hào)整數(shù))的數(shù)值,用于標(biāo)識(shí)應(yīng)用程序中不同的對(duì)象和同類對(duì)象中不同的實(shí)例。如標(biāo)識(shí)一個(gè)窗口、按鈕、圖標(biāo)、滾動(dòng)條、輸入/輸出設(shè)備、控件或文件等。應(yīng)用程序通過(guò)句柄能夠訪問(wèn)相應(yīng)的對(duì)象信息。10.2Windows程序設(shè)計(jì)的常用數(shù)據(jù)結(jié)構(gòu)第14頁(yè)/共87頁(yè)16常用的句柄類型HWND 標(biāo)識(shí)窗口句柄HINSTANCE 標(biāo)識(shí)當(dāng)前實(shí)例句柄HCURSOR 標(biāo)識(shí)光標(biāo)句柄HFONT 標(biāo)識(shí)字體句柄HPEN 標(biāo)識(shí)畫筆句柄HBRUSH 標(biāo)識(shí)畫刷句柄HDC 標(biāo)識(shí)設(shè)備環(huán)境句柄HBITMAP 標(biāo)識(shí)位圖句柄HICON 標(biāo)識(shí)圖標(biāo)句柄HMENU 標(biāo)識(shí)菜單句柄HFILE 標(biāo)識(shí)文件句柄10.2Windows程序設(shè)計(jì)的常用數(shù)據(jù)結(jié)構(gòu)第15頁(yè)/共87頁(yè)17關(guān)鍵字 類型 等價(jià)于BOOL 邏輯類型 intBOOLEAN 邏輯 BYTEBYTE 字節(jié) unsingedcharCHAR 字符 charDOUBLE 雙精度 doubleDWORD 雙字 unsignedlongFLOAT 浮點(diǎn)數(shù) floatHANDLE 句柄 10.2.2常用數(shù)據(jù)類型第16頁(yè)/共87頁(yè)18INT 整數(shù) intLONG 長(zhǎng)整數(shù) longSHORT 短整數(shù) short UCHAR 無(wú)符號(hào)字符 unsingedcharUINT 無(wú)符號(hào)整數(shù) unsingedintULONG 無(wú)符號(hào)長(zhǎng)整數(shù) unsignedlongUSHORT 無(wú)符號(hào)短整數(shù) unsigendshortVOID voidWCHAR 雙字節(jié)碼 unsignedshortWCHAR_T 雙字節(jié)碼 unsignedshortWORD 字 unsignedshort第17頁(yè)/共87頁(yè)19WPARAM 消息參數(shù) UINTLPARAM 消息參數(shù) LONGLRESULT 消息返回值 LONG HINSTANCE 實(shí)例句柄 unsignedlongHWAND 窗口句柄 unsignedlongHDC 設(shè)備環(huán)境句柄 unsignedlongTCHAR 字符 charLPSTR 字符指針 char*LPCSTR 常量字符指針 constchar*LPTSTR 字符指針 TCHAR*LPVOID 無(wú)類型指針 void*LPCVOID 無(wú)類型長(zhǎng)指針 constvoid*第18頁(yè)/共87頁(yè)20(1)坐標(biāo)結(jié)構(gòu)typedefstructtagPOINT{

LONGx;

LONGy;}POINT;注:在MFC中還有一個(gè)類CPoint,與POINT結(jié)構(gòu)近似,但它有許多成員函數(shù)。(2)長(zhǎng)、寬尺寸結(jié)構(gòu):CSIZE,Csize;typedefstructtagSIZE{

intcx;

intcy;}SIZE;10.2.3點(diǎn)和矩形區(qū)域第19頁(yè)/共87頁(yè)21(3)記錄矩形區(qū)域結(jié)構(gòu)RECT和CrecttypedefstructtagRECT{

LONGleft;

LONGtop;

LONGright;

LONGbottom;}RECT;

在MFC中Crect與此類似,但有成員函數(shù)。

LPRECT為指針RECT類型的常數(shù)指針。(4)顏色COLORREF32-bitvalueusedtospecifyanRGBcolor.

例:COLORREFRGB(BYTEbRed,BYTEbGreen,BYTEBblue);

第20頁(yè)/共87頁(yè)2210.2.4窗口結(jié)構(gòu)typedefstruct{

UINTstyle;

//窗口類型

WNDPROClpfnWndProc;

//窗口函數(shù)指針

intcbClsExtra;//為類結(jié)構(gòu)的預(yù)留額外空間

intcbWndExtra;

//為窗口結(jié)構(gòu)預(yù)留額外空間

HANDLEhInstance;

//窗口類的應(yīng)用實(shí)例句柄

HICONhIcon;

//圖標(biāo)句柄

HCURSORhCursor;

//窗口類的光標(biāo)

HBRUSHhbrBackground;//窗口類的背景刷

LPCTSTRlpszMenuName;

//菜單資源名

LPCTSTRlpszClassName;

//窗口類名}WNDCLASS;

第21頁(yè)/共87頁(yè)2310.2.4窗口結(jié)構(gòu)WNDCLASS中的style代表窗口類型,可取下面的值:WS_CHILD 子窗口(不能與WS_POPUP同時(shí)使用)WS_BORDER 帶邊框的窗口WS_CAPTION 帶標(biāo)題欄的窗口WS_HSCROLL 帶有水平滾動(dòng)條的窗口WS_MAXIMIZE 最大尺寸的窗口WS_MAXIMIZEBOX 帶最大化框的窗口WS_MINIMIZE 最小尺寸的窗口WS_MINIMIZEBOX 帶最小化框的窗口WS_OVERLAPPED 帶邊框和標(biāo)題欄的窗口WS_OVERLAPPEDWINDOW 帶邊框、標(biāo)題欄、系統(tǒng)菜單及最大、最小化框的窗口WS_POPUP 彈出式窗口WS_POPUPWINDOW 帶邊框和系統(tǒng)菜單的彈出式窗口WS_SYSMENU 帶系統(tǒng)菜單的窗口WS_VSCROLL 帶垂直滾動(dòng)條的窗口第22頁(yè)/共87頁(yè)241、消息結(jié)構(gòu):MSGtypedefstructtagMSG{

HWND

hwnd;//消息發(fā)向的窗口句柄

UINT

message;//消息標(biāo)識(shí)符

WPARAMwParam;//16位的消息參數(shù),值因消息異

LPARAMlParam;//32位的消息參數(shù),值因消息異

DWORD

time;

//消息放入消息隊(duì)列的時(shí)間

POINT

pt;//消息放入消息隊(duì)列的鼠標(biāo)位置}MSG;

說(shuō)明:WPARAM含義和數(shù)值因消息不同而不同比如:鍵盤消息和鼠標(biāo)消息所對(duì)應(yīng)的WPARAM消息所代表的消息是不同的。10.2.5消息第23頁(yè)/共87頁(yè)2510.2.5消息2、MSG中的域說(shuō)明hwnd是一個(gè)窗口句柄,用于標(biāo)識(shí)消息發(fā)向的窗口。time用于保存消息放進(jìn)消息隊(duì)列的時(shí)間。pt用于保存將消息放入消息隊(duì)列時(shí)的鼠標(biāo)位置。message是消息標(biāo)識(shí)符,它是一個(gè)32位的無(wú)符號(hào)整數(shù)。Windows中的每條消息都有一個(gè)對(duì)應(yīng)的消息標(biāo)識(shí)符,這些標(biāo)識(shí)符是在windows.h中定義的。第24頁(yè)/共87頁(yè)263、消息的種類

標(biāo)準(zhǔn)Windows消息除WM_COMMAND外,所有以WM_為前綴的消息,由窗口和視圖處理??刂葡⒂煽丶妥哟翱诎l(fā)給父窗口的消息。命令消息來(lái)自用戶接口對(duì)象。如:菜單、工具條和加速鍵等。10.2.5消息第25頁(yè)/共87頁(yè)2710.2.5消息4、常見(jiàn)消息前綴的含義BM表示按鈕控制消息CB組合框控制消息EM編輯框控制消息LB列表控制消息SBM滾動(dòng)條控制消息WM窗口消息第26頁(yè)/共87頁(yè)2810.2.5消息5、Windows常用鼠標(biāo)消息WM_LBUTTONDBLCLKWM_LBUTTONDOWNWM_LBUTTONUPWM_MBUTTONDBLCLKWM_MBUTTONDOWNWM_MBUTTONUP

WM_RBUTTONDBLCLKWM_RBUTTONDOWNWM_RBUTTONUP第27頁(yè)/共87頁(yè)2910.2.5消息6、Windows常用鍵盤消息WM_KEYUPWM_KEYDOWN

按下非系統(tǒng)鍵時(shí)產(chǎn)生此消息,系統(tǒng)鍵是指實(shí)現(xiàn)系統(tǒng)操作的組合鍵,如Alt和F1相結(jié)合的按鈕鍵。附加參數(shù)wParam為按下鍵的虛擬鍵碼,lParam記錄按鈕的重復(fù)次數(shù)、先前狀態(tài)等。WM_KEYUP是釋放按鍵時(shí)的鍵盤消息,其含義同WM_KEYDOWN。

WM_CHAR按下非系統(tǒng)鍵時(shí)產(chǎn)生的消息,附加參數(shù)wParam為按鍵的ASCII碼,lparam同前。第28頁(yè)/共87頁(yè)307、其它常用Windows常用消息WM_CREATECreateWindow函數(shù)發(fā)生的消息。WM_CLOSE關(guān)閉窗口時(shí)產(chǎn)生的消息,如有子窗口,也一起刪除。WM_DESTROY關(guān)閉窗口時(shí)產(chǎn)生的消息WM_PAINThdc=(HDC)wParam;//發(fā)生用戶區(qū)域移動(dòng)或顯示事件、用戶窗口改變大小的事件、程序通過(guò)流動(dòng)條滾動(dòng)窗口,覆蓋在窗口上面的其它對(duì)象(如菜單)移開(kāi)時(shí),都會(huì)產(chǎn)生此消息!10.2.5消息第29頁(yè)/共87頁(yè)318、消息的產(chǎn)生用戶產(chǎn)生消息

Windows本身產(chǎn)生消息應(yīng)用程序本身產(chǎn)生消息其他應(yīng)用程序產(chǎn)生消息9、消息的傳遞Windows系統(tǒng)有一個(gè)存放消息的隊(duì)列,每個(gè)應(yīng)用程序也有一個(gè)消息隊(duì)列。Windows系統(tǒng)先將收到的消息存放在系統(tǒng)隊(duì)列中;然后再分發(fā)到相應(yīng)的應(yīng)用程序隊(duì)列中。應(yīng)用程序則從自身的隊(duì)列中獲取消息并進(jìn)行處理。10.2.5消息第30頁(yè)/共87頁(yè)3210、消息的處理通常每個(gè)Windows應(yīng)用程序至少對(duì)應(yīng)一個(gè)窗口,每個(gè)窗口都要有一個(gè)窗口函數(shù)負(fù)責(zé)處理該窗口內(nèi)所發(fā)生的事件。每個(gè)窗口至少有一個(gè)窗口函數(shù),負(fù)責(zé)處理該窗口的所有消息。10.2.5消息第31頁(yè)/共87頁(yè)331、Windows標(biāo)識(shí)符常用命名規(guī)則函數(shù)命名規(guī)則函數(shù)名=動(dòng)詞+名詞動(dòng)詞和名詞的第一個(gè)字母必須大寫例GetMessage變量命名規(guī)則小寫字母前綴表示變量的類型,其余的部分描述變量的功能例nCount匈牙利命名法變量名以小寫字母或代表數(shù)據(jù)類型的小寫字母開(kāi)頭.Eg:szCmdLine補(bǔ)充:Windows程序的名字第32頁(yè)/共87頁(yè)34前綴代表的數(shù)據(jù)類型ccharorWCHARorTCHARbyBYTE(unsignedchar)nshortiintx,yintusedasx-coordinateory-coordinatecx,cyintusedasxorylength;cstandsfor"count"borfBOOL(int);fstandsfor"flag"wWORD(unsignedshort)lLONG(long)dwDWORD(unsignedlong)fnfunctionsstringszstringterminatedby0characterhhandleppointer2、Windows程序常見(jiàn)名字前綴的含義第33頁(yè)/共87頁(yè)3510.3Windows程序的基本結(jié)構(gòu)1、簡(jiǎn)單的Windows程序至少包含兩個(gè)函數(shù):WinMain():必有且僅有一個(gè)。是程序執(zhí)行的入口點(diǎn),類似于C程序中的main函數(shù)窗口函數(shù)

:每個(gè)窗口對(duì)應(yīng)一個(gè)窗口函數(shù),以響應(yīng)該程序窗口中發(fā)生的事件消息。2、WinMain()函數(shù)需完成的功能定義窗口類注冊(cè)窗口類建立窗口類的窗口顯示窗口運(yùn)行消息循環(huán)第34頁(yè)/共87頁(yè)3610.3Windows程序的基本結(jié)構(gòu)3、Windows程序的執(zhí)行邏輯Windows系統(tǒng)首先為該程序建立必備的程序環(huán)境,如定義并初始化一些全局變量,接下來(lái)就尋找并進(jìn)入WinMain函數(shù)。WinMain是Window程序的入口點(diǎn),由它控制程序的執(zhí)行流程。WinMain函數(shù)依次完成以下工作:調(diào)用API函數(shù)定義并注冊(cè)窗口類,創(chuàng)建程序窗口,顯示窗口,建立消息循環(huán),等待用戶操作程序窗口。用戶在程序窗口中所作的每件事情都會(huì)產(chǎn)生一個(gè)消息,該消息會(huì)被Windows傳遞到該程序的消息隊(duì)列中。WinMain中的消息循環(huán)會(huì)不斷地從本程序的消息隊(duì)列中獲取消息,并將其傳遞給該窗口的窗口處理函數(shù),由窗口處理函數(shù)對(duì)消息進(jìn)行處理,實(shí)現(xiàn)相應(yīng)的程序功能。第35頁(yè)/共87頁(yè)3710.3.2Win32Application程序設(shè)計(jì)在MiscrosoftVisualC++中的API程序設(shè)計(jì)方法一般的編程方法是先用VC++的Win32Application向?qū)Ы⒁粋€(gè)Windows應(yīng)用程序的框架,然后將它修改成自己的程序,并根據(jù)需要添加一些頭文件、源程序文件及資源文件?!纠?0-1】在VC++6.0環(huán)境下設(shè)計(jì)一個(gè)簡(jiǎn)單的WindowsAPI程序,該程序在窗口中顯示字符串"Hellow,APIProgramming!"。第36頁(yè)/共87頁(yè)3810.3.2Win32Application程序設(shè)計(jì)編程過(guò)程如下:(1)啟動(dòng)VC++6.0,選擇菜單“文件|新建”,在彈出的“新建”對(duì)話框中選擇“工程”標(biāo)簽頁(yè),如圖所示。第37頁(yè)/共87頁(yè)3910.3.2Win32Application程序設(shè)計(jì)(2)選中“工程”對(duì)話框中的“Win32Application”列表項(xiàng),并在“位置”編輯框中指定本項(xiàng)目建立的磁盤目錄,然后在“工程”編輯框中輸入項(xiàng)目文件的名字。(3)單擊“確定”按鈕,并在彈出的對(duì)話框中選中“Anemptyproject.”單選項(xiàng),然后單擊“完成”按鈕。最后將得到如圖10-7(a)所示的空項(xiàng)目文件窗口。(4)選擇菜單“文件|新建”,然后在彈出的對(duì)話框中選擇“文件”標(biāo)簽,并選擇列表中的“C++SourceFile”項(xiàng)目,然后在“文件”編輯框中輸入源程序文件名“HellApi”,如圖10-7(b)所示。輸入完成后,單擊“結(jié)束”按鈕。第38頁(yè)/共87頁(yè)4010.3.2Win32Application程序設(shè)計(jì)第39頁(yè)/共87頁(yè)4110.3.2Win32Application程序設(shè)計(jì)(5)打開(kāi)目錄C:\dk\HellApi,在該目錄中可以看到以下文件名:HellApi.cpp、HellApi.dsp、HellApi.dsw、HellApi.ncb、HellApi.opt,這些文件就是在前面的操作過(guò)程產(chǎn)生的。(6)在HellApi.cpp中輸入下面的程序代碼。第40頁(yè)/共87頁(yè)42HellApi.cpp#include<windows.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszAppName[]=TEXT("HelloWin");HWNDhwnd;MSGmsg;第41頁(yè)/共87頁(yè)43

WNDCLASSwndclass;

wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;

if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"),szAppName,MB_ICONERROR);return0;}注冊(cè)窗口類定義窗口的屬性,如大小、寬度,前景色等第42頁(yè)/共87頁(yè)44hwnd=CreateWindow(szAppName, //用于建立窗口的類名

TEXT("TheHelloProgram"), //窗口標(biāo)題

WS_OVERLAPPEDWINDOW,//窗口類型

CW_USEDEFAULT, //窗口左上角X坐標(biāo)為默認(rèn)值

CW_USEDEFAULT, //窗口左上角Y坐標(biāo)為默認(rèn)值

CW_USEDEFAULT, //窗口寬度為默認(rèn)值

CW_USEDEFAULT, //窗口高度為默認(rèn)值

NULL, //該窗口沒(méi)有父窗口

NULL, //該窗口沒(méi)有菜單

hInstance, //創(chuàng)建本窗口的程序句柄

NULL); //系統(tǒng)保留參數(shù)

ShowWindow(hwnd,iCmdShow); //顯示窗口,hwnd代表上面建立的窗口

UpdateWindow(hwnd); //更新窗口,繪制窗口客戶區(qū)本段程序建立并顯示一個(gè)窗口第43頁(yè)/共87頁(yè)45while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}Windows程序的消息循環(huán)第44頁(yè)/共87頁(yè)46LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam){HDChdc;PAINTSTRUCT ps;RECTrect;窗口處理函數(shù),是一個(gè)回調(diào)函數(shù),每個(gè)應(yīng)用程序至少有一個(gè)窗口處理函數(shù),窗口函數(shù)的參數(shù)由Windows傳遞,這些參數(shù)是由事件消息產(chǎn)生的。第45頁(yè)/共87頁(yè)47switch(message){ //消息處理

caseWM_CREATE:return0;

caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,"Hello,WindowsAPI",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);

EndPaint(hwnd,&ps);return0;caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,message,wParam,lParam);}第46頁(yè)/共87頁(yè)4810.3.3Windows程序的控制流程所有Windows應(yīng)用程序具有相同的程序結(jié)構(gòu)和執(zhí)行控制流程,步驟如下:(1)創(chuàng)建全局變量(2)程序入口函數(shù)WinMain()函數(shù)接收控制(3)WinMain()登記窗口(4)WinMain()建立窗口(5)WinMain()進(jìn)入消息循環(huán)(6)當(dāng)窗口中有事件發(fā)生時(shí),事件消息進(jìn)入消息循環(huán)隊(duì)列(7)windows操作系統(tǒng)分析消息,調(diào)用該窗口的窗口函數(shù)進(jìn)行處理。(8)WinMain函數(shù)退出,程序終止。第47頁(yè)/共87頁(yè)49初始化所有全局對(duì)象WinMain()登記窗口建立窗口消息循環(huán)Hello,WindowsAPI顯示窗口程序出口:WM_QUITWindows程序的控制流程第48頁(yè)/共87頁(yè)5010.3.3Windows程序的控制流程接下來(lái)將對(duì)API程序的建立、執(zhí)行流程進(jìn)行進(jìn)一步的剖析。借此理解Windows程序的結(jié)構(gòu),事件驅(qū)動(dòng)和消息循環(huán)的本質(zhì)。第49頁(yè)/共87頁(yè)51DOS平臺(tái)的C程序的入口點(diǎn)是main()函數(shù),在WINDOW的C++程序的入口點(diǎn)是WinMain()函數(shù)。其定義形式為:intAPIENTRYWinMain(

HINSTANCEhInstance,//

HINSTANCEhPrevInstance,

LPSTRlpCmdLine,

intnCmdShow)實(shí)例句柄,當(dāng)程序在WINDOWS下運(yùn)行時(shí),它唯一地標(biāo)識(shí)該程序當(dāng)程序在WINDOWS下有多個(gè)副本運(yùn)行時(shí),它標(biāo)識(shí)該程序的前一個(gè)副本標(biāo)識(shí)傳給該程序的命令行參數(shù),近似于main()函數(shù)的char*argv[]指示窗口在Window中的顯示方式,其值為1-7,如:值1表示SW_SHOWNORMAL//窗口以常規(guī)顯示見(jiàn)第321頁(yè)表10-41、程序入口點(diǎn)第50頁(yè)/共87頁(yè)52窗口總是在窗口類的基礎(chǔ)上創(chuàng)建的,窗口類標(biāo)識(shí)了處理窗口消息的窗口過(guò)程,這是非常重要的。在創(chuàng)建窗口之前,必須先調(diào)用RegisterClass函數(shù)注冊(cè)一個(gè)窗口類,以后可以基于這個(gè)已登錄的窗口創(chuàng)建多個(gè)窗口。

只有程序的第一個(gè)實(shí)例需要注冊(cè)窗口類!

例10-1的注冊(cè)窗口如下:2、注冊(cè)窗口類第51頁(yè)/共87頁(yè)53

WNDCLASSwndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,“Thisprogram……!",szAppName,MB_ICONERROR);return0;}發(fā)生在本窗口中的事件由WndProc處理,這是WinMain與窗口函數(shù)的關(guān)聯(lián)!第52頁(yè)/共87頁(yè)543、創(chuàng)建窗口hwnd=CreateWindow( szAppName,//windowclassnameTEXT("TheHelloProgram"),//windowcaptionWS_OVERLAPPEDWINDOW,//windowstyleCW_USEDEFAULT,//initialxpositionCW_USEDEFAULT,//initialypositionCW_USEDEFAULT,//initialxsizeCW_USEDEFAULT,//initialysizeNULL,//parentwindowhandleNULL,//windowmenuhandlehInstance,//programinstancehandleNULL );//creationparameters

if(!hWnd){returnFALSE;}//建立窗口失敗

第53頁(yè)/共87頁(yè)554、顯示窗口

ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);hWnd是前面創(chuàng)建的窗口的句柄nCmdShow是窗口顯示的方式,缺省值為1即:SW_SHOWNORMALhWnd是前面創(chuàng)建的窗口的句柄,該函數(shù)產(chǎn)生WM_PAINT消息,導(dǎo)致窗口被重繪第54頁(yè)/共87頁(yè)565、消息循環(huán)調(diào)用UpdateWindow(hWnd);函數(shù)之后,窗口就顯示在顯示屏幕上,這時(shí)程序就進(jìn)入了消息循環(huán),等待用戶用鍵盤或鼠標(biāo)操作窗口,產(chǎn)生消息。產(chǎn)生的消息將被放入消息隊(duì)列:

第55頁(yè)/共87頁(yè)575、

Windwos消息循環(huán)系統(tǒng)消息隊(duì)列應(yīng)用程序隊(duì)列1應(yīng)用程序隊(duì)列2應(yīng)用程序隊(duì)列3應(yīng)用程序隊(duì)列n應(yīng)用程序1WinMain()函數(shù)消息循環(huán)窗口函數(shù)1窗口函數(shù)m應(yīng)用程序1WinMain()函數(shù)消息循環(huán)窗口函數(shù)1窗口函數(shù)m硬件輸入MSG本隊(duì)列由Windows系統(tǒng)建立和維護(hù)MSGMSGMSGMSGMSGMSGMSGMSG第56頁(yè)/共87頁(yè)58while(GetMessage(&msg,NULL,0,0)){ {TranslateMessage(&msg); DispatchMessage(&msg); } }消息循環(huán)從此開(kāi)始,它從消息隊(duì)列中取出一條消息,WM_QUIT則退出將MSG消息進(jìn)行傳給WINDOWS系統(tǒng),并進(jìn)行一些鍵盤轉(zhuǎn)換再將MSG消息傳給WINDOWS系統(tǒng),然后WINDOWS系統(tǒng)將該消息傳給正確的窗口過(guò)程,讓它進(jìn)行處理。本程序是由WndProc函數(shù)處理,處理完畢后,WndProc返windows,因?yàn)榇藭r(shí)Windows調(diào)用還處于DispatchMessage函數(shù),在該函數(shù)執(zhí)行后,再次返回到下一個(gè)GetMessage函數(shù)第57頁(yè)/共87頁(yè)59Windows應(yīng)用程序的消息處理流程WM_KEYDOWNWM_KEYUPWM_MOUSEMOVEWM_LBUTTONUPWM_QUIT…應(yīng)用程序消息隊(duì)列WinMain()消息循環(huán)WndProc()caseWM_KEYDOWNcaseWM_KEYUPcaseWM_LBUTTUP…defaultWM_CREATEWM_DESTROYWM_SIZEWM_PAINT…①④②GetMessage()③檢索到的消息DispatchMessage()⑤DefWindowProc⑥Windows系統(tǒng)應(yīng)用程序回調(diào)第58頁(yè)/共87頁(yè)606、窗口函數(shù)實(shí)際的動(dòng)作發(fā)生在窗口函數(shù)中,窗口函數(shù)確定了在窗口的客戶區(qū)域中顯示些什么以及窗口函數(shù)怎樣響應(yīng)用戶的輸入。LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)說(shuō)明:1、WndProc是一個(gè)回調(diào)函數(shù)

CALLBACK指定窗口函數(shù)是一個(gè)回調(diào)函數(shù)?;卣{(diào)就是由Windows系統(tǒng)調(diào)用的意思,即窗口函數(shù)是由Windows系統(tǒng)調(diào)用的,應(yīng)用程序不必調(diào)用它。

第59頁(yè)/共87頁(yè)612、窗口函數(shù)的參數(shù)每個(gè)Windows應(yīng)用程序的窗口函數(shù)都有著相同的參數(shù)表:第1個(gè)參數(shù)hWnd用于標(biāo)識(shí)接收消息的窗口句柄;第2個(gè)參數(shù)message用于標(biāo)識(shí)消息,該消息將被用于處理消息的switch結(jié)構(gòu)中;第3、4個(gè)參數(shù)wParam和lParam是message的附加信息,它們的內(nèi)容隨message消息而異,如鼠標(biāo)消息與鍵盤消息的wParam和lParam參數(shù)就不一樣。窗口函數(shù)主要利用這些參數(shù)響應(yīng)窗口事件,實(shí)現(xiàn)程序功能。6、窗口函數(shù)第60頁(yè)/共87頁(yè)627、消息處理

窗口函數(shù)所接收的消息都是用一個(gè)數(shù)值來(lái)標(biāo)識(shí)的,它就是傳遞給窗口過(guò)程的message參數(shù),消息在WINDOWS.H頭文件中定義,它們是以“WM_”的標(biāo)識(shí)符。 一般地,在WINDOWS程序中使用switch和case結(jié)構(gòu)來(lái)確定窗口函數(shù)接收的是什么消息以及如何處理它。 窗口窗口函數(shù)不處理的消息被傳給DefWindowProc函數(shù)進(jìn)行缺省處理。第61頁(yè)/共87頁(yè)63switch(message){caseWM_CREATE:……break;caseWM_PAINT:……break;caseWM_DESTROY:……default:returnDefWindowProc(……);}消息處理過(guò)程第62頁(yè)/共87頁(yè)648、數(shù)據(jù)輸出與WM_PAINT消息

WM_PAINT消息對(duì)于windows程序設(shè)計(jì)是極其重要的,當(dāng)窗口客戶區(qū)的一部分或全部變?yōu)椤盁o(wú)效”時(shí),將產(chǎn)生該消息,它導(dǎo)致窗口重繪。Hellowwindow中窗口的類型為:CS_HREDRAW|CS_VREDRAW;該類型指示當(dāng)窗口水平或垂直方向發(fā)生變化時(shí),窗口將產(chǎn)生WM_PAINT消息致使窗口重繪。第63頁(yè)/共87頁(yè)65WM_PAINT消息的處理模式:

hdc=BeginPaint(hwnd,&ps)…………進(jìn)行窗口繪制的程序代碼

……EndPaint(hwnd,&ps);8、數(shù)據(jù)輸出與WM_PAINT消息

第64頁(yè)/共87頁(yè)669、WM_DESTROY消息與程序結(jié)束

這是一條重要的消息,它指示windows系統(tǒng)關(guān)閉該應(yīng)用程序。系統(tǒng)菜單上的close或ALT+F4都會(huì)產(chǎn)生該消息。Hellowwindow程序通過(guò)

PostQuitMessage(0);函數(shù)產(chǎn)生該消息。導(dǎo)致應(yīng)用程序的關(guān)閉。第65頁(yè)/共87頁(yè)67WM_DESTROY與WinMain結(jié)束應(yīng)用程序消息隊(duì)列WinMain()消息循環(huán)WndProc()caseWM_KEYDOWNcaseWM_KEYUPcaseWM_DESTROY…defaultWM_DESTROY消息①④②GetMessage()③WM_QUIT退出消息循環(huán)結(jié)束應(yīng)用程序⑤PostQuitMessage(0)⑥Windows系統(tǒng)應(yīng)用程序第66頁(yè)/共87頁(yè)6810.4WindowsAPI程序設(shè)計(jì)的方法Windows程序由主函數(shù)WinMain和窗口處理函數(shù)構(gòu)成。WinMain是程序執(zhí)行的入口點(diǎn),每個(gè)WinMain的主要功能是創(chuàng)建程序窗口、建立消息循環(huán),其程序結(jié)構(gòu)和代碼幾乎完全相同。窗口函數(shù)主要處理發(fā)生在程序窗口中的各種用戶事件(如選擇菜單、單擊鼠標(biāo)等),是Windows程序設(shè)計(jì)的主體和重點(diǎn),程序的不同功能都是在窗口函數(shù)的消息處理中實(shí)現(xiàn)的。因此編程工作主要在窗口函數(shù)中。在VC++環(huán)境中設(shè)計(jì)API程序時(shí),可以先利用VC++向?qū)梢粋€(gè)簡(jiǎn)單的應(yīng)用程序框架,然后對(duì)框架程序中的窗口函數(shù)進(jìn)行修改,添加響應(yīng)窗口事件的消息處理代碼段,增加程序的數(shù)據(jù)輸出和消息處理功能,就能夠?qū)崿F(xiàn)需要的程序功能。第67頁(yè)/共87頁(yè)6910.4.1Windows程序的數(shù)據(jù)輸出1、GDI(GraphicsDeviceInterface)

GDI是Windows為應(yīng)用程序提供的圖形設(shè)備接口,其中提供了豐富的圖形API函數(shù)。GDIAPI函數(shù)大致可以分為3種類型①字符輸出類函數(shù),以圖形方式輸出字符、文本;②矢量圖形函數(shù),用于繪制點(diǎn)、線、橢圓、三角形等幾何圖形;③光柵圖形函數(shù),用于繪制位圖。第68頁(yè)/共87頁(yè)7010.4.1Windows程序的數(shù)據(jù)輸出2、設(shè)備無(wú)關(guān)性是指在用GDI函數(shù)設(shè)計(jì)針對(duì)不同硬件設(shè)備的輸出程序時(shí),不必考慮具體的硬件特性,只需用統(tǒng)一的方式編寫程序,Windows系統(tǒng)會(huì)自動(dòng)調(diào)用具體設(shè)備的硬件驅(qū)動(dòng)程序?qū)DI圖形輸出程序轉(zhuǎn)換成特定硬件設(shè)備的輸出程序。第69頁(yè)/共87頁(yè)7110.4.1Windows程序的數(shù)據(jù)輸出3、設(shè)備環(huán)境(DeviceContext,DC)也稱為設(shè)備描述表或設(shè)備上下文。是Windows為了實(shí)現(xiàn)設(shè)備無(wú)關(guān)性而向應(yīng)用程序提供了一個(gè)虛擬邏輯設(shè)備,它其實(shí)是一種數(shù)據(jù)結(jié)構(gòu),其中存了繪圖操作需要的所有信息,如繪畫筆、字體、圖畫顏色、繪制的圖形背景及繪圖的模式。設(shè)備環(huán)境由Windows系統(tǒng)統(tǒng)一管理,當(dāng)應(yīng)用程序需要輸出圖形(包括字符)時(shí),必須向Windows系統(tǒng)提出申請(qǐng),用完后必須釋放,以便其他程序申請(qǐng)使用。DC相當(dāng)畫家手中的繪圖工具,包括畫紙、畫筆、顏料……。程序只需要用DC中的畫筆在DC中作畫,Windows就會(huì)直接將之轉(zhuǎn)換輸出到顯示器、打印機(jī)之類的輸出設(shè)備上。第70頁(yè)/共87頁(yè)7210.4.1Windows程序的數(shù)據(jù)輸出4、Windows程序的輸出過(guò)程(1)程序首先獲取設(shè)備環(huán)境句柄(2)通過(guò)該句柄調(diào)用圖形設(shè)備接口的繪圖函數(shù)繪圖。(3)繪圖函數(shù)所繪制的圖形被Windows系統(tǒng)提供的設(shè)備驅(qū)動(dòng)程序轉(zhuǎn)換成具體物理設(shè)備的繪圖函數(shù),從而在具體硬件設(shè)備上繪制出圖形。第71頁(yè)/共87頁(yè)735.獲取設(shè)備環(huán)境(1)用API函數(shù)BeginPaint獲取設(shè)備環(huán)境句柄如果在WM_PAINT消息處理中輸出圖形,就應(yīng)該使用函數(shù)BeginPaint獲取設(shè)備環(huán)境句柄,用法如下:……PAINTSTRUCTps;//此數(shù)據(jù)結(jié)構(gòu)的說(shuō)明見(jiàn)下頁(yè)…… caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//獲取設(shè)備環(huán)境句柄

…… //繪制圖形或輸出文本的程序代碼

EndPaint(hwnd,&ps);

第72頁(yè)/共87頁(yè)745.獲取設(shè)備環(huán)境說(shuō)明:(1)PAINTSTRUCT結(jié)構(gòu)的定義如下:typedefstructtagPAINTSTRUCT{HDChdc; //設(shè)備環(huán)境句柄

BOOLfErase; //指示是否擦除無(wú)效區(qū)域背景

RECTrcPaint; //用于標(biāo)識(shí)無(wú)效的矩形區(qū)域

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

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

BYTErgbReserved[16];//系統(tǒng)保留}PAINTSTRUCT;(2)BeginPaint用于獲取設(shè)置環(huán)境句柄,EndPaint用于釋放設(shè)備環(huán)境句柄。BeginPaint和EndPaint必須配對(duì)使用。第73頁(yè)/共87頁(yè)755.獲取設(shè)備環(huán)境(2)用GetDC獲取設(shè)備環(huán)境句柄如果在是在除WM_PAINT之外的其他消息處理中輸出圖形,就應(yīng)該用GetDC獲取設(shè)備環(huán)境句柄,用完后必須使用ReleaseDC將其釋放。其形式如下:caseWM_XX: //WM_XX非WM_PAINThdc=GetDC(hWnd); //hWnd是窗口句柄………… //繪制圖形或輸出文本的程序代碼ReleaseDC(hWnd,hdc); //釋放設(shè)備環(huán)境句柄break;其中:GetDC和ReleaseDC須配對(duì)使用第74頁(yè)/共87頁(yè)766.輸出圖形設(shè)備環(huán)境(即設(shè)備描述表)定義了繪圖的圖形對(duì)象和圖形模式,應(yīng)用程序獲取到了設(shè)備環(huán)境后,就能夠通過(guò)設(shè)備環(huán)境句柄使用GDIAPI函數(shù)來(lái)繪制圖形。在用設(shè)備環(huán)境輸出圖形之前,應(yīng)用程序可以事先把一些繪圖對(duì)象選入設(shè)備環(huán)境中,然后就可以用這些對(duì)象來(lái)繪制圖形。表5-1是常用的繪圖對(duì)象對(duì)象定義對(duì)象句柄的結(jié)構(gòu)Windows定義的備用對(duì)象說(shuō)明BitmapHBITMAP

用于處理位圖BrushHBRUSHXX_BRUSH用于填充圖形的內(nèi)部PaletteHPALETTE用于管理顏色FontHFONTXX_FONT用于設(shè)置文本的字體PenHPENXX_PEN用于繪制圖形第75頁(yè)/共87頁(yè)776.輸出圖形GDI中常用的函數(shù)MoveTo(hDC,x,y); //將畫筆從當(dāng)前位置移到(x,y)坐標(biāo)BOOLLineToEx(HDChdc,intx,inty); //從當(dāng)前點(diǎn)畫直線到(x,y)坐標(biāo)處BOOLRectangle(HDChdc,intx1,inty1,intx2,inty2);//以(x1,y1)為左上角坐標(biāo),(x2,y2)為右下角坐標(biāo)畫矩形BOOLRoundRect(HDChdc,intx1,inty1,intx2,inty2,inth,intw);//以(x1,y1)為左上角坐標(biāo),(x2,y2)為右下角坐標(biāo)畫圓角矩形BOOLEllipse(HDChdc,intx1,inty1,intx2,inty2);//以(x1,y1)為左上角坐標(biāo),(x2,y2)為右下角坐標(biāo)畫橢圓第76頁(yè)/共87頁(yè)787.輸出文本W(wǎng)indows程序的文本按圖形方式輸出。輸出文本時(shí)必須以像素為單位精確定位每一行的輸出位置。常用文本輸出函數(shù)有TextOut和DrawTexBOOLTextOut(HDChdc,intx,inty,LPCTSTRlpString,intn);intDrawText(HDChdc,LPCTSTRlpString,intn,LPRECTlpRect,UINTuFormat);第77頁(yè)/共87頁(yè)797.輸出文本輸出文本的字體設(shè)置問(wèn)題Windows提供了豐富的字體,不同字體的高度和寬度也不盡相同,函數(shù)GetTextMetrics能夠獲取當(dāng)前字體的詳細(xì)信息,如字符的完度、高度、字間距、行間距等信息。其原型如下:BOOLGetTextMetrics(HDChdc,TEXTMETRICS&tm);TEXTMETRICS是保存字體信息的數(shù)據(jù)結(jié)構(gòu),主要域如下:typedefstructtagTEXTMETRIC{LONGtmHeight; //字符高度

LONGtmExternalLeading; //行間距

LONGtmAveCharWidth; //字符的平均寬度

LONGtmMaxCharWidth; //最大字符寬度

LONGtmWeight; //字符的粗細(xì)度

BYTEtmCharSet; //字符集……}TEXTMETRIC;第78頁(yè)/共87頁(yè)8010.4.1Windows程序的數(shù)據(jù)輸出【例10-2】在例10-1的基礎(chǔ)上,修改窗口函數(shù)中的WM_PAINT消息,讓程序用默認(rèn)畫筆和畫刷繪制一個(gè)矩形,然后創(chuàng)建藍(lán)色畫筆和紅色網(wǎng)格畫刷編繪制一個(gè)矩形和橢圓。并通過(guò)函數(shù)TextOut

分別用系統(tǒng)默認(rèn)色彩和紅色輸出兩行文本。修改后的窗口函數(shù)WndProc

如下:第79頁(yè)/共87頁(yè)81WndProc

函數(shù)的程序代碼LRESULTCALLBACKWndProc(…){…… //同例10-1HPENhPen,hPenOld; //定義畫筆HBRUSHhBrush,HbruOld; //定義畫刷TEXTMETRICtm; //定義tm用于獲取字體信息intx=10,y=150;switch(message){ //消息處理caseWM_CREATE:return0;第80頁(yè)/共87頁(yè)82caseWM_PAINT:hPen=(HPEN)CreatePen(PS_SOLID,3,RGB(0,0,255));//創(chuàng)建藍(lán)色實(shí)線畫筆,寬3像素點(diǎn)hBrush=(HBRUSH)CreateHatchBrush(HS_CROSS,RGB(255,0,0));//創(chuàng)建紅色網(wǎng)格線的畫刷hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT("Hello,APIP

溫馨提示

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