




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Windows編程基礎(chǔ)-概述作者:未知閱讀人次:96284文章來(lái)源:未知發(fā)布時(shí)間:2004-12-21網(wǎng)友評(píng)論(44)條1.1、Windows的介紹Windows是一種基于圖形界面的多任務(wù)操作系統(tǒng)。為這個(gè)環(huán)境開(kāi)發(fā)的程序有著相同的外觀和命令結(jié)構(gòu)。對(duì)用戶 來(lái)說(shuō),這使得學(xué)習(xí)使用Windows應(yīng)用程序變得容易了。為了幫助開(kāi)發(fā)Windows應(yīng)用程序,Windows提供了大量的內(nèi)建 函數(shù)以方便地使用彈出菜單、滾動(dòng)條、對(duì)話框、圖標(biāo)和其他一些友好的用戶界面應(yīng)該具有的特性。Windows運(yùn)行應(yīng)用程序以硬件無(wú)關(guān)的方式來(lái)處理視頻顯示、鍵盤、鼠標(biāo)、打印機(jī)、串行口以及系統(tǒng)時(shí)鐘。最值 得注意的Windows特性就是其標(biāo)準(zhǔn)
2、化的圖形用戶界面。統(tǒng)一的界面使用圖片或圖標(biāo)來(lái)代表磁盤驅(qū)動(dòng)器、文件、子目 錄以及其它操作系統(tǒng)的命令和動(dòng)作。統(tǒng)一的用戶界面也為程序員帶來(lái)了好處。例如,你可以很方便地使用常見(jiàn)菜單和對(duì)話框的內(nèi)建函數(shù)。所有的菜單都具有相同風(fēng)格的鍵盤和鼠標(biāo)接口,因?yàn)槭荳indows而不是程序員在實(shí)現(xiàn)它。Windows的多任務(wù)環(huán)境允許用戶在同一時(shí)刻運(yùn)行多個(gè)應(yīng)用程序或同一個(gè)應(yīng)用程序的多個(gè)實(shí)例。一個(gè)應(yīng)用程序可 能處于激活狀態(tài)。激活的應(yīng)用程序是指它正接收用戶的輸入。因?yàn)槊恳粋€(gè)瞬間僅有一個(gè)程序能夠被處理,因此同一時(shí)間也只能有一個(gè)應(yīng)用程序處于激活狀態(tài)。但是,可以有任意個(gè)數(shù)的并行運(yùn)行的任務(wù)。1.2、Windows的簡(jiǎn)要?dú)v史Window
3、s最初由Microsoft公司在1983年11月宣布,1985年11月推出了第一公開(kāi)發(fā)行版本,即1.01版。此后兩年,1.01版進(jìn)行了幾次修改以滿足國(guó)際市場(chǎng)的需求,并增減了一些顯示器和打印機(jī)的驅(qū)動(dòng)程序。1987年11月發(fā)行的Windows 2.0版在用戶界面上做了些改進(jìn)。例如:重疊式窗口的引入,還增強(qiáng)了鍵盤和鼠標(biāo)接口,特別是增強(qiáng)了選單和對(duì)話框的功能(略) 1.3、用戶界面的構(gòu)件1.3.1 窗口窗口是屏幕上與一個(gè)應(yīng)用程序相關(guān)的矩形區(qū)域,它是用戶與產(chǎn)生該窗口的應(yīng)用程序之間的可視界面。對(duì)應(yīng)用程序來(lái)說(shuō),窗口是應(yīng)用程序控制下的屏幕上的一個(gè)矩形區(qū)域,應(yīng)用程序創(chuàng)建并控制窗口的所有方面。當(dāng)用戶啟動(dòng)一個(gè)應(yīng)用程序
4、時(shí),一個(gè)窗口就被創(chuàng)建。每當(dāng)用戶操作窗口中的對(duì)象時(shí),程序就有所響應(yīng)。1.3.2 邊框絕大多數(shù)窗口都有一個(gè)環(huán)繞著它的邊框,邊框不僅作為窗口的邊界,它也用來(lái)指明窗口的狀態(tài),即窗口是否是一個(gè)活動(dòng)窗口。當(dāng)我們將鼠標(biāo)指針?lè)旁谶吙蛏习聪率髽?biāo)鍵并移動(dòng)鼠標(biāo)時(shí),就可以改變窗口的大小。1.3.3 標(biāo)題欄標(biāo)題欄位于窗口的頂部,其中顯示的文本信息用于標(biāo)注程序,一般是應(yīng)用程序的名字,這便于用戶知道哪個(gè)應(yīng)用程序正在運(yùn)行。標(biāo)題欄的顏色反映一個(gè)窗口是否是一個(gè)活動(dòng)窗口。1.3.4 控制框控制框是每個(gè)窗口左上方的小圖片,每個(gè)應(yīng)用程序都使用它。在控制圖標(biāo)上單擊鼠標(biāo)鍵會(huì)使Windows顯示系統(tǒng)菜單。系統(tǒng)菜單它提供了諸如還原、移動(dòng)、大小
5、、最小化、最大化以及關(guān)閉這樣的標(biāo)準(zhǔn)操作。1.3.5 最小化圖標(biāo)每個(gè)Windows 98及Windows NT應(yīng)用程序都在窗口的右上角顯示三個(gè)圖標(biāo)。最左邊的圖標(biāo)是一段短下劃線,這就是最小化圖標(biāo)。它可以使用程序被最小化。1.3.6 最大化圖標(biāo)最大化圖標(biāo)是三個(gè)圖標(biāo)中中間的那一個(gè),看起來(lái)象兩個(gè)小窗口。使用最大化圖標(biāo)可以使用應(yīng)用程序占滿整個(gè)屏幕。如果選擇了這個(gè)圖標(biāo),其它應(yīng)用程序窗口都會(huì)被蓋住。1.3.7 垂直滾動(dòng)條如果有必要,應(yīng)用程序可以顯示一個(gè)垂直滾動(dòng)條。垂直流動(dòng)條顯示在應(yīng)用程序窗口的右邊,在兩端有兩個(gè)方向相反的箭頭。它還有一個(gè)著色的棒和一個(gè)透明的窗口塊。后者被用于顯示當(dāng)前顯示內(nèi)容與整個(gè)文檔的關(guān)系。你
6、可以用滾動(dòng)條來(lái)選擇顯示哪一頁(yè)。一般在任何一個(gè)箭頭上單擊一下會(huì)使顯示內(nèi)容移動(dòng)一行。單擊向上箭頭下方的窗口塊并拖動(dòng)它會(huì)使屏幕輸出快速更新到應(yīng)用程序屏幕輸出的任意位置。1.3.8 水平滾動(dòng)條也可以顯示一個(gè)水平滾動(dòng)條 。水平滾動(dòng)條顯示在窗口的底部,具有與垂直滾動(dòng)條類似的功能。你用它來(lái)選擇 要顯示哪些列。一般在任何一個(gè)箭頭上單擊一個(gè)會(huì)使顯示內(nèi)容移動(dòng)一列。單擊向左箭頭右邊的窗口塊并拖動(dòng)它會(huì)使屏幕輸出快速更新到應(yīng)用程序屏幕輸出的任意位置。1.3.9 選單欄一個(gè)可選擇的菜單條可以顯示在標(biāo)題條的下方。通過(guò)菜單條來(lái)選擇菜單和子菜單。這種選擇可以通過(guò)用鼠標(biāo)單擊,也可以用熱鍵組合來(lái)實(shí)現(xiàn)。熱鍵組合經(jīng)常是ALT與命令中帶
7、下劃線的字母的組合,比如File命令中的 “F”。1.3.10 用戶區(qū)通常用戶區(qū)占據(jù)了窗口最大的部分。這是應(yīng)用程序的基本輸出區(qū)域。應(yīng)當(dāng)由應(yīng)用程序來(lái)復(fù)雜管理用戶區(qū)。另外,應(yīng)用程序可以輸出到用戶區(qū)。1.4、面向?qū)ο蟮乃季S方法對(duì)于程序員來(lái)說(shuō),面向?qū)ο笠馕吨浅J煜さ氖挛铮簩⑹澜缈闯墒且唤M彼此相關(guān)并相互通信的實(shí)體即對(duì)象組成,每個(gè)對(duì)象有一個(gè)名字來(lái)標(biāo)識(shí),這是人們通常看待世界的方式。例如,當(dāng)看見(jiàn)一輛汽車時(shí),所見(jiàn)到的是一輛汽車,而不是一大堆原子。人們可以將汽車分解為車輪、發(fā)動(dòng)機(jī)、車門、油箱等,它們都是具體的實(shí)體即對(duì)象。對(duì)象之間的通信被稱為發(fā)送消息,即一個(gè)對(duì)象請(qǐng)求另一個(gè)對(duì)象執(zhí)行某種方式的操作。例如,交叉路口的紅
8、燈“請(qǐng)求”駕駛員停車,駕駛員在接受到消息之后,他所執(zhí)行的動(dòng)作是踏下制動(dòng)踏板,這有向汽車發(fā)送了一條消息,汽車在接受到此消息之后,又將該消息分解之后發(fā)送到相關(guān)的對(duì)象上:制動(dòng)器作用于車輪上,將動(dòng)能轉(zhuǎn)變成為勢(shì)能,使車速降下來(lái);尾燈又向它后面的其它車輛的駕駛員發(fā)送消息;各種儀表盤向駕駛員反饋出所發(fā)送的消息的動(dòng)作結(jié)果。從程序員角度而言,對(duì)象是內(nèi)存中一塊有名的存儲(chǔ)單元。我們通常所謂的變量就是一種數(shù)據(jù)對(duì)象,但對(duì)象的概念比變量的含義更廣義,通常將對(duì)象定義成為包含有數(shù)據(jù)和代碼的內(nèi)存區(qū)域,數(shù)據(jù)表征對(duì)象的特征,而代碼用于響應(yīng)消息,使對(duì)象進(jìn)行某些動(dòng)作。從屏幕上顯示的一個(gè)可視的窗口對(duì)象為例,我們可以對(duì)比分析一下用戶心目中
9、的對(duì)象和程序員心目中的對(duì)象的關(guān)系。窗口對(duì)象的特征,例如顏色、長(zhǎng)度、其中顯示的信息等,在程序中被表示為數(shù)據(jù),用戶對(duì)窗口對(duì)所做的操作,例如移動(dòng)窗口、改變窗口的大小等,使得用戶向窗口發(fā)送了消息,這些消息引起了計(jì)算機(jī)(內(nèi)存中的)對(duì)象執(zhí)行相應(yīng)的代碼,代碼執(zhí)行的結(jié)果改變了對(duì)象中的數(shù)據(jù),使對(duì)應(yīng)的可以視對(duì)象 的位置和大小發(fā)生了變化。對(duì)象為響應(yīng)消息所執(zhí)行的代碼被稱為方法,對(duì)象中保存的數(shù)據(jù)構(gòu)成對(duì)象的屬性,對(duì)象的抽象定義就是執(zhí)行某些動(dòng)作,否則,沒(méi)有其它途徑可以使一個(gè)對(duì)象動(dòng)作起來(lái)。向一個(gè)對(duì)象發(fā)送消息在程序中表示為:functionName(id, arg1, arg2, .);其中,消息是functionName,i
10、d是標(biāo)識(shí)對(duì)象的一個(gè)對(duì)象名,或稱其為對(duì)象的標(biāo)識(shí)符,Windows使用某種類型的 數(shù)據(jù)來(lái)作為對(duì)象的標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符號(hào)常被稱為對(duì)象的句柄。arg1等為消息所帶的參數(shù)。雖然發(fā)消息類似于標(biāo)準(zhǔn)的函數(shù)調(diào)用,但消息也有函數(shù)調(diào)用中沒(méi)有的特性,例如,消息始終在執(zhí)行一選擇機(jī)制,其參數(shù)與其它消息區(qū)別開(kāi)來(lái),從而告訴該對(duì)象完成什么樣的操作。一個(gè)函數(shù)名始終指向內(nèi)存中該函數(shù)的代碼所位于的確定地址,消息并不指向內(nèi)存中的某地址,但卻告訴接受消息的對(duì)象要引用的內(nèi)存地址是什么。函數(shù)不僅說(shuō)明操作,而且還要執(zhí)行如何完成該操作的方法。消息只說(shuō)明該操作,在對(duì)象中定義的方法說(shuō)明如何完成該操作。當(dāng)向不同的對(duì)象發(fā)送相同的消息時(shí),所執(zhí)行的方法是不
11、同的。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,每個(gè)對(duì)象由一個(gè)類來(lái)定義,類是對(duì)一組性質(zhì)相同的對(duì)象的程序描述,它是由概括了一組對(duì)象共同性質(zhì)的方法和數(shù)據(jù)組成。從一組對(duì)象中抽象出公共的方法與數(shù)據(jù),將它們保存在一個(gè)類中是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心。在日常生活中,我們也以類這種方式來(lái)定義客觀對(duì)象。通過(guò)對(duì)客觀對(duì)象進(jìn)行抽象,我們將性質(zhì)相同的對(duì)象歸為一類,形成概念,例如,人類、蘋果類、食品類等。通過(guò)對(duì)客觀對(duì)象分類,我們也可以更好地認(rèn)識(shí)客觀對(duì)象,例如,當(dāng)知道張三是一個(gè)人時(shí),不用對(duì)張三進(jìn)行更多的描述,我們已知道張三作為一個(gè)人所具有的特征和行為,因?yàn)樗鼈円呀?jīng)在“人”類中進(jìn)行了描述。在面向?qū)ο蟮某绦蛑?,類被用作樣板?lái)生產(chǎn)具有相同行為方式的
12、對(duì)象。類就像是生產(chǎn)對(duì)象的一個(gè)工廠,在生產(chǎn)對(duì)象時(shí),對(duì)象具有類中所描述的同樣的數(shù)據(jù)結(jié)構(gòu)和方法,同時(shí),對(duì)象的每個(gè)數(shù)據(jù)在創(chuàng)立之初取得一個(gè)初始值,形成對(duì)象的初始狀態(tài)。對(duì)象通過(guò)發(fā)送消息相互作用,對(duì)象的狀態(tài)從一種狀態(tài)過(guò)渡到另一種狀態(tài),當(dāng)所有的有關(guān)對(duì)象到達(dá)某種特定的狀態(tài)時(shí)就得程序的運(yùn)行結(jié)果。使用類產(chǎn)生對(duì)象的過(guò)程也稱為生成該類的一個(gè)實(shí)例。因此,對(duì)象也可以定義為對(duì)象是類的一個(gè)實(shí)例。定義類也意味著將該類的對(duì)象公用代碼放在內(nèi)存的公共區(qū)域中,而不必對(duì)每個(gè)對(duì)象都將它們的代碼和數(shù)據(jù)重新進(jìn)行一次描述,這減輕了程序員的勞動(dòng)強(qiáng)度。我們可以將一些常用對(duì)象定義放在一個(gè)公用庫(kù)中,而在程序中需要該類的一個(gè)對(duì)象時(shí),就創(chuàng)建該類的一個(gè)實(shí)例。W
13、indows已為程序員預(yù)定義了許多像按鈕、滾動(dòng)杠和對(duì)話框等對(duì)象的類,當(dāng)程序員需要這些類的對(duì)象時(shí),僅需創(chuàng)立該類的實(shí)例即可。對(duì)于同一個(gè)類的不同對(duì)象,在建立對(duì)象時(shí)其初始狀態(tài)不同,因而這些對(duì)象在屏幕上顯示的位置、大小等屬性也不相同,但同類的對(duì)象的操作是相同的(因?yàn)樗鼈児灿孟嗤姆椒ǎ?。這也就是為什么不同的Windows應(yīng)用程序?qū)τ脩舯憩F(xiàn)出一致的操作特性的原因之一。1.5、句柄Windows應(yīng)用程序中存在許多對(duì)象,例如選單、窗口、圖標(biāo)、內(nèi)存對(duì)象、位圖、刷子、設(shè)備對(duì)象和程序?qū)嵗?,在Windows中,對(duì)象使用句柄進(jìn)行標(biāo)識(shí),這樣,通過(guò)使用一個(gè)句柄,應(yīng)用程序可以訪問(wèn)一個(gè)對(duì)象。在Windows軟件開(kāi)發(fā)工具中,句
14、柄被定義為一種新的數(shù)據(jù)類型。在應(yīng)用程序中,對(duì)句柄的使用一般只有賦值(句柄可以被賦以初始值、被改變?yōu)橛糜跇?biāo)識(shí)同類對(duì)象中的另一個(gè)對(duì)象和被用作函數(shù)的參數(shù))、與NULL進(jìn)行相等比較(判定一個(gè)句柄是否為一個(gè)有效的句柄)和與標(biāo)識(shí)同類對(duì)象的另一個(gè)句柄進(jìn)行相等比較(判定兩個(gè)句柄是否標(biāo)識(shí)同一個(gè)對(duì)象),沒(méi)有其它的運(yùn)算。雖然在有的書中介紹說(shuō)句柄是一個(gè)十六位的整數(shù),但實(shí)際情況并不這樣簡(jiǎn)單,它的長(zhǎng)度將會(huì)隨著不同的計(jì)算機(jī)平臺(tái)和Windows的發(fā)展而有所變化,例如,在32位Windows中,句柄將是一個(gè)32位的數(shù)據(jù),并且不是整數(shù)類型。一種通用句柄類型為HANDLE,在Windows 3.1以前的版本中,它可被用于標(biāo)識(shí)所有種
15、類的對(duì)象,在Windows 3.1中,部分地保留了這一特點(diǎn),在本教程的程序中也有所反映。在Windows 3.1中,從HANDLE類型又派生出了一些新的句柄數(shù)據(jù)類型,每種類型的句柄用于標(biāo)識(shí)一種類型的對(duì)象,下面是一些常見(jiàn)的句柄類型:類型說(shuō)明HANDLE通用句柄類型HWND標(biāo)識(shí)一個(gè)窗口對(duì)象HDC標(biāo)識(shí)一個(gè)設(shè)備對(duì)象HMENU標(biāo)識(shí)一個(gè)選單對(duì)象HICON標(biāo)識(shí)一個(gè)圖標(biāo)對(duì)象HCURSOR標(biāo)識(shí)一個(gè)光標(biāo)對(duì)象HBRUSH標(biāo)識(shí)一個(gè)刷子對(duì)象HPEN標(biāo)識(shí)一個(gè)筆對(duì)象HFONT標(biāo)識(shí)一個(gè)字體對(duì)象HINSTANCE標(biāo)識(shí)一個(gè)應(yīng)用程序模塊的一個(gè)實(shí)例HLOCAL標(biāo)識(shí)一個(gè)局部?jī)?nèi)存對(duì)象HGLOBAL標(biāo)識(shí)一個(gè)全局內(nèi)存對(duì)象1.6、數(shù)據(jù)類型及常
16、量為便于開(kāi)發(fā)Windows應(yīng)用程序,Windows的開(kāi)發(fā)者新定義了一些數(shù)據(jù)類型。這些數(shù)據(jù)類型或是與C/C+中已有的數(shù)據(jù)類型同義,或是一些新的結(jié)構(gòu)數(shù)據(jù)類型。引入這些類型的主要目的是為便于程序員開(kāi)發(fā)Windows應(yīng)用程序,同時(shí)也是為了增強(qiáng)程序的可讀性;另一個(gè)目的是為了便于程序?qū)?lái)能被移植到其它種類的計(jì)算機(jī)平臺(tái)上或適應(yīng)Windows將來(lái)的新版本的變化。例如,本教程目前使用16位API(Application Program Interface),現(xiàn)在Windows的版本使用32位API,只要將HANDLE等句柄類型定義為32位長(zhǎng),然后重新編譯程序,就可以很方便地將一個(gè)使用16位API的Windows
17、應(yīng)用程序改為使用32位API的程序,使其能運(yùn)行在32位API Windows上。大部分的數(shù)據(jù)類型在Windows.h中定義,下面是在這個(gè)文件中定義的部分類型:#definePASCALpascal#defineNEARnear#defineFAR fartypedefunsigned char BYTEtypedefunsigned shortWORDtypedefunsigned long DWORDtypedeflongLONGtypedefchar *PSTRtypedef char NEAR *NPSTRtypedefchar FAR*LPSTRtypedefvoidVOIDtyped
18、efint *LPINTtypedefLONG(PASCAL FAR * FARPROC)();在Windows.h中,使用typedef還定義了一些新的結(jié)構(gòu)類型。這些結(jié)構(gòu)類型的名字也使用大寫形式的標(biāo)識(shí)符:類型說(shuō)明MSG消息結(jié)構(gòu)WNDCLASS窗口的類的結(jié)構(gòu)PAINTSTRUCT繪圖結(jié)構(gòu)POINT點(diǎn)的坐標(biāo)的結(jié)構(gòu)RECT矩形結(jié)構(gòu)我們?cè)谶@里以類型MSG為例來(lái)說(shuō)明類型的定義方法,對(duì)于其它類型,在以后用到時(shí)再作詳細(xì)地說(shuō)明。類型MSG是一個(gè)消息結(jié)構(gòu),它的定義方式及其各域的含義如下:typedef struct tagMSG HWNDhWnd;/ 窗口對(duì)象的標(biāo)識(shí)符,該條消息傳遞到它所標(biāo)識(shí)的窗口上 UINT
19、 message;/ 消息標(biāo)識(shí)符,標(biāo)識(shí)某個(gè)特定的消息 WPARAMwParam;/ 隨同消息傳遞的16位參數(shù) LPARAMlParam;/ 隨同消息傳遞的32位參數(shù) DWORD time;/ 消息產(chǎn)生的時(shí)間 POINT pt;/ 產(chǎn)生消息時(shí)光標(biāo)在屏幕上的坐標(biāo) MSG;typedefMSGFAR*LPMSG;其中的POINT類型的定義是:typedefstructtagPOINT int x; /* X坐標(biāo) */int y;/* Y坐標(biāo) */ POINT; typedefPOINTFAR*LPPOINT;Windows.h在定義大部分類型的同時(shí),還定義了該類型的指針類型。例如,上例中的LPPOI
20、NT和LPMSG等,其中字母前綴LP表示遠(yuǎn)指針類型;若使用NP作為一個(gè)類型的前綴,則表示近指針類型;若使用P作為一個(gè)類型的前綴時(shí),則表示一般的指針類型,這時(shí)由編譯程序時(shí)所使用的內(nèi)存模塊決定這種指針是遠(yuǎn)指針或是近指針。在Windows.h中說(shuō)明的大部分指針類型都采用這里介紹的方法進(jìn)行說(shuō)明,例如,LPRECT,它表示一個(gè)RECT類型的遠(yuǎn)指針。在Windows.h中說(shuō)明的大部分指針類型使用了C/C+的關(guān)鍵字const,如果一個(gè)指針類型的名字前綴為L(zhǎng)PC、NPC或PC,則其中的字母C表示這種類型的指針變量所指向的變量不能通過(guò)該指針變量來(lái)修改,這種指針類型一般采用下述方法進(jìn)行說(shuō)明:typedefcons
21、tPOINTFAR* LPCPOINT;typedefconstRECFAR* LPCRECT;一個(gè)使用const修飾的指針(稱其為const指針)可以指向沒(méi)有使用const修飾的變量,但沒(méi)有使用const修飾的指針不能指向const修飾的變量,例如:constPOINTpt;LPCPOINTlpPoint = &pt;/ 正確LPPOINT lpPoint = &pt;/ 錯(cuò)誤當(dāng)向函數(shù)傳遞參數(shù)時(shí),必須特別注意這個(gè)問(wèn)題,例如:voidfun(LPPOINT lppt) ;.LPCPOINT lpPoint ;fun(lpPoint) ;編譯器將指示這個(gè)函數(shù)調(diào)用語(yǔ)句是錯(cuò)誤的。所以,在一個(gè)函數(shù)不修
22、改一個(gè)指針參數(shù)所指向的變量的情況下,最好將該參數(shù)說(shuō)明為const指針,使const類型的指針也能用于該函數(shù)的參數(shù)。Windows.h中說(shuō)明的大部分函數(shù)使用了const指針參數(shù)。在Windows.h中,大多數(shù)語(yǔ)句是用于定義一個(gè)常量,例如:#denfineWM_QUIT0X0012該語(yǔ)句用標(biāo)識(shí)符WM_QUIT來(lái)表示編號(hào)為0X0012的消息。每個(gè)常量由一個(gè)前綴和表示其含義的單詞組成的標(biāo)識(shí)符組成,兩者之間用下畫線隔開(kāi)。前綴表明這些常量所屬的一般范疇。下面是一些前綴和它們所屬的范疇的說(shuō)明。類型說(shuō)明CS窗口類的風(fēng)格(Class Style)IDI預(yù)定義的圖標(biāo)對(duì)象的標(biāo)識(shí)符(IDentity of Icon)
23、IDC預(yù)定義的光標(biāo)對(duì)象的標(biāo)識(shí)符(IDentity of Cursor)WS窗口的風(fēng)格(Windows Style)CW創(chuàng)建窗口(Create Windows)WM窗口消息(Windows Message)DT繪制文本(Drawing Text)在變量名的表示方法方面,Windows推薦使用一種稱為“匈牙利表示法”的方法。每個(gè)變量名用小寫字母或描述了變量的數(shù)據(jù)類型的字母作為前綴,變量的名字緊跟其后,且用大寫字母開(kāi)始的單詞(一個(gè)或多個(gè)單詞)表示其含義,這樣每個(gè)變量都能附加上其數(shù)據(jù)類型的助記符。例如:WORDwOffset ;/* w表示W(wǎng)ORD類型 */DWORD dwValue ;/* dw表示
24、DWORD類型 */下面是Windows中常使用的一些字母前綴和它們所代表的數(shù)據(jù)類型:類型說(shuō)明bBOOL,布爾類型byBYTE類型cchar類型dwDWORD類型fn函數(shù)類型i整型lLONG類型lp遠(yuǎn)(長(zhǎng))指針(long pointer)n短整型np近(短)指針(near pointer)p指針s字符串sz以0結(jié)尾的字符串wWORD類型xshort,用于表示X坐標(biāo)時(shí)yshort,用于表示Y坐標(biāo)時(shí)Windows程序員也可以根據(jù)上述思想和使用目的,發(fā)明一些其他的前綴,但要注意,對(duì)這些前綴的使用必須保持前后一致。在Windows中,所有的函數(shù)根據(jù)其用途來(lái)命名,它們一般由2到3個(gè)英文單詞組成,每個(gè)單詞
25、的第一個(gè)字母大寫,例如,函數(shù)CreateWindow(),由該函數(shù)的名字可以知道它的用途是創(chuàng)建一個(gè)窗口。1.7、應(yīng)用程序使用的一些術(shù)語(yǔ)本節(jié)介紹Winodws應(yīng)用程序使用的一些術(shù)語(yǔ)及其相關(guān)概念,在后面的章節(jié)中介紹有關(guān)的內(nèi)容時(shí),再對(duì)其中的概念進(jìn)行詳細(xì)的討論。1.7.1 模塊在Windows中,術(shù)語(yǔ)“模塊”一般是指任何能被裝入內(nèi)存中運(yùn)行的可執(zhí)行代碼和數(shù)據(jù)的集合。更明確地講,模塊指的就是一個(gè).EXE文件(又稱為應(yīng)用程序模塊),或一個(gè)動(dòng)態(tài)鏈接庫(kù)(DLL Dynamic Linking Library,又被稱為動(dòng)態(tài)鏈接庫(kù)模塊或DLL模塊),或一個(gè)設(shè)備驅(qū)動(dòng)程序,也可能是一個(gè)程序包含的能被另一個(gè)程序存取的數(shù)據(jù)
26、資源。模塊一詞也被用于特指自包含的一段程序。例如,一個(gè)可單獨(dú)編譯的源文件,或該源文件被編譯器處理之后所生成的目標(biāo)程序。當(dāng)制作一個(gè)程序時(shí),模塊一詞用于指被連接在一起的許多模塊中的某個(gè)模塊。Windows本身由幾個(gè)相關(guān)的模塊組成,Windows API函數(shù)就是在Windows啟動(dòng)時(shí)裝入內(nèi)存中的幾個(gè)動(dòng)態(tài)鏈接庫(kù)模塊實(shí)現(xiàn)的。其中的三個(gè)主要模塊是USER.EXE(用于窗口管理等)、KERNEL.EXE(用于內(nèi)存管理的多任務(wù)調(diào)度)和GDI.EXE(圖形設(shè)備接口,用于圖形輸出等)。1.7.2 應(yīng)用程序一個(gè)Windows應(yīng)用程序是被Windows調(diào)用或在Windows下運(yùn)行的一個(gè)程序,這個(gè)程序可以調(diào)用靜態(tài)連接庫(kù)
27、(也就是C的運(yùn)行時(shí)間庫(kù))中的函數(shù)和DLL的函數(shù),它也可以啟動(dòng)其它的應(yīng)用程序。一個(gè)應(yīng)用程序在運(yùn)行時(shí)的輸入被Windows捕獲,并以消息的形式傳送到應(yīng)用程序的活動(dòng)窗口上。一個(gè)應(yīng)用程序的輸出也是通過(guò)Windows進(jìn)行的,所有的輸出首先被送給Windows。許多MS-DOS應(yīng)用程序基本上占據(jù)整個(gè)計(jì)算機(jī),并認(rèn)為所有的計(jì)算機(jī)資源只屬于該應(yīng)用程序,應(yīng)用程序告訴相對(duì)被動(dòng)的MS-DOS應(yīng)做什么。在一個(gè)Windows應(yīng)用程序中,Windows自身是非常主動(dòng)的,并且和應(yīng)用程序協(xié)同得非常緊密。Windows管理著計(jì)算機(jī)的所有資源,并調(diào)度這些資源,使它們可為正在Windows上運(yùn)行的所有應(yīng)用程序共享。1.7.3 任務(wù)和
28、實(shí)例Windows將運(yùn)行的應(yīng)用程序?qū)嵗鳛椴煌娜蝿?wù)。當(dāng)一個(gè)應(yīng)用程序的多個(gè)實(shí)例在運(yùn)行時(shí),它們也被Windows當(dāng)作不同的任務(wù)。Windows為一個(gè)模塊的每一個(gè)實(shí)例都裝入一個(gè)缺省數(shù)據(jù)段,但可執(zhí)行代碼只能裝入一次。也就是說(shuō),同一個(gè)模塊的實(shí)例共享相同的代碼,但有自己私用的數(shù)據(jù)段。對(duì)每一個(gè)模塊、任務(wù)或?qū)嵗?,Windows分別使用一個(gè)句柄來(lái)標(biāo)識(shí)它。在窗口對(duì)象的私有數(shù)據(jù)存儲(chǔ)區(qū)存儲(chǔ)有一個(gè)應(yīng)用程序的任務(wù)句柄、實(shí)例句柄和模塊句柄。任務(wù)句柄被Windows的任務(wù)調(diào)度程序用于進(jìn)行任務(wù)調(diào)度。通過(guò)模塊句柄,Windows可以知道一個(gè)模塊當(dāng)前有多少實(shí)例正在運(yùn)行。同一個(gè)模塊的不同實(shí)例有相同的模塊句柄,但有不同的任務(wù)和實(shí)例句
29、柄。當(dāng)Windows由于內(nèi)存管理的需要而廢棄了一個(gè)實(shí)例的代碼段時(shí),通過(guò)模塊句柄,Windows可以從模塊中重新裝入這個(gè)實(shí)例所需的代碼。1.7.4 動(dòng)態(tài)鏈接庫(kù)DLL是一種有別于MS-DOS應(yīng)用程序所使用的庫(kù)模塊(例如 C的運(yùn)行時(shí)間庫(kù))的一種特殊的庫(kù)模塊,它含有可能 被其它應(yīng)用程序調(diào)用的函數(shù)。一個(gè)DLL在運(yùn)行時(shí)被動(dòng)態(tài)地連接到一個(gè)應(yīng)用程序中或另一個(gè)DLL中,而不是在制作應(yīng)用程序時(shí)靜態(tài)地連接到應(yīng)用程序中的(這種方法是在制作MS-DOS應(yīng)用程序中使用的方法,它們?cè)赪indows應(yīng)用程序中仍然可以繼續(xù)被使用)。使用DLL的好處在于,當(dāng)有多個(gè)應(yīng)用程序使用同一個(gè)DLL并且同時(shí)在Windows中運(yùn)行時(shí),該DLL
30、在內(nèi)存中只有一個(gè)實(shí)例。1.7.5 應(yīng)用程序設(shè)計(jì)接口應(yīng)用程序設(shè)計(jì)接口(API)是應(yīng)用程序用于操作周圍環(huán)境的一組函數(shù)調(diào)用接口。Windows API大約有600多個(gè)函 數(shù),學(xué)習(xí)Windows程序設(shè)計(jì)的許多工作就是學(xué)習(xí)如何使用這些API。1.7.6 Windows下的函數(shù)在進(jìn)行Windows應(yīng)用程序設(shè)計(jì)中,程序員除了需要知道有關(guān)一個(gè)函數(shù)的常用信息(例如函數(shù)的名字,近函數(shù)或遠(yuǎn)函數(shù),返回類型以及應(yīng)如何調(diào)用)之外,同時(shí)還要知道更多的內(nèi)容:一個(gè)回調(diào)函數(shù)、引出函數(shù)或是一個(gè)引入函數(shù)。引出函數(shù):這個(gè)術(shù)語(yǔ)與一個(gè)函數(shù)如何在一個(gè)模塊中說(shuō)明而在另一個(gè)模塊中被調(diào)用有關(guān)。引出函數(shù)是在一個(gè)模塊中定義而在這個(gè)模塊之外被調(diào)用的一種
31、函數(shù);或是被Windows或是被另一個(gè)模塊調(diào)用。這些函數(shù)必須以一種特定的方式進(jìn)行說(shuō)明,并被編譯器作特殊的處理。這樣,當(dāng)它們被調(diào)用時(shí),它們會(huì)被正確地束定到合適的數(shù)據(jù)段上。DLL為其它模塊提供要被調(diào)用的函數(shù),因此,每個(gè)DLL一般都帶有一個(gè)DLL庫(kù),以便應(yīng)用程序可以合法地調(diào)用DLL中的函數(shù)。DLL庫(kù)由DLL中每個(gè)引出函數(shù)的入口點(diǎn)組成。整個(gè)Windows API就是由構(gòu)成Windows環(huán)境的不同的模塊所引出的函數(shù)組成,這些API函數(shù)的入口點(diǎn)在一個(gè)名為IMPORT.LIB的DLL庫(kù)中說(shuō)明。引入函數(shù):在DLL中引出的函數(shù)若要能為一個(gè)模塊調(diào)用,必須在這個(gè)模塊中將這個(gè)函數(shù)說(shuō)明為引入函數(shù)。由此可見(jiàn)引出函數(shù)和引入
32、函數(shù)表達(dá)的是從兩種角度處理同一個(gè)函數(shù)的術(shù)語(yǔ):引出模塊中的一個(gè)函數(shù)使得這個(gè)函數(shù)能被其它模塊調(diào)用;調(diào)用引出函數(shù)的模塊通過(guò)引入這個(gè)函數(shù)才能調(diào)用它。在制作Windows應(yīng)用程序時(shí),連接器自動(dòng)包含一個(gè)名為IMPORT.LIB的庫(kù)文件。這個(gè)文件允許應(yīng)用程序調(diào)用Windows API中的函數(shù)。這個(gè)文件被稱為引入庫(kù)。引入庫(kù)提供了應(yīng)用程序與一個(gè)到多個(gè)DLL中可被這個(gè)應(yīng)用程序調(diào)用的函數(shù)之間的連接?;卣{(diào)函數(shù):回調(diào)函數(shù)是一種特殊的引出函數(shù),是由 Windows環(huán)境直接調(diào)用的函數(shù)。一個(gè)應(yīng)用程序至少要有一個(gè)回調(diào)函數(shù)。當(dāng)一條消息要交給應(yīng)用程序處理時(shí),Windows調(diào)用這個(gè)回調(diào)函數(shù)。這個(gè)函數(shù)對(duì)應(yīng)于一個(gè)活動(dòng)窗口,被稱為這個(gè)窗口
33、的窗口函數(shù)。因?yàn)樵S多應(yīng)用程序至少建立一個(gè)窗口,并且Windows需要向這個(gè)窗口發(fā)送消息,所以,處理消息的函數(shù)必須由Windows調(diào)用。在請(qǐng)求Windows枚舉它所維護(hù)的對(duì)象時(shí),例如字體或窗口,Windows也要調(diào)用應(yīng)用程序中的回調(diào)函數(shù)。當(dāng)向Windows提出這樣的請(qǐng)求時(shí),就必須向Windows提供回調(diào)函數(shù)的地址。由于引出函數(shù)是在不同的模塊中被調(diào)用的,也就是說(shuō),調(diào)用者的代碼段與被調(diào)用的引出函數(shù)的代碼段不在同一個(gè)段中,因此,在所開(kāi)發(fā)的Windows應(yīng)用程序中,引出函數(shù)都被說(shuō)明為遠(yuǎn)函數(shù)。為了程序運(yùn)行的效率原因,引出函數(shù)都使用Pascal調(diào)用約定,這種調(diào)用約定不同于C調(diào)用約定的地方在于: 最左邊的參數(shù)
34、先入棧:Pascal調(diào)用約定的參數(shù)進(jìn)入棧的順序是函數(shù)調(diào)用中最左邊的參數(shù)先入棧。C的調(diào)用約定與此相反,它采用最右邊的參數(shù)先入棧。 被調(diào)用的函數(shù)負(fù)責(zé)從展中清除參數(shù):Pascal調(diào)用約定的函數(shù)在返回時(shí)負(fù)責(zé)清除棧中的參數(shù);C調(diào)用約定的函數(shù)不作這種工作,而由調(diào)用者來(lái)作;這樣,當(dāng)程序中調(diào)用了大量的使用C調(diào)用約定的函數(shù)時(shí),為清除棧中的參數(shù),在程序中要額外地增加許多代碼。 全局標(biāo)識(shí)符不保持原來(lái)的大小寫(一般被為大寫形式),也不在標(biāo)識(shí)符前面加下劃線。 為便于程序開(kāi)發(fā)活動(dòng),在Windows.h中定義了兩個(gè)類型名,用于在程序說(shuō)明引出函數(shù):類型說(shuō)明WINAPI等價(jià)于FAR PASCAL,說(shuō)明該函數(shù)是一個(gè)引出函數(shù),這個(gè)
35、類型名只用于在DLL中說(shuō)明引出函數(shù),或在應(yīng)用程序中對(duì)DLL中的引出函數(shù)進(jìn)行函數(shù)說(shuō)明時(shí)。CALLBACK等價(jià)于FAR PASCAL,說(shuō)明該函數(shù)是一個(gè)回調(diào)函數(shù),它常被用在應(yīng)用程序模塊中說(shuō)明一個(gè)窗口函數(shù)或其它種類的回調(diào)函數(shù)。1.8、事件和消息在Windows中,用戶或系統(tǒng)中所發(fā)生的任何活動(dòng)被當(dāng)作事件來(lái)處理,例如,用戶按下了鼠標(biāo)按鈕,就產(chǎn)生一鼠標(biāo)事件。對(duì)于所發(fā)生的每一個(gè)事件,Windows將其轉(zhuǎn)換成消息的形式放在一個(gè)稱為消息隊(duì)列的內(nèi)存區(qū)中,然后由Windows的消息發(fā)送程序選擇適合的對(duì)象,將消息隊(duì)列中的消息發(fā)送到欲接受消息的對(duì)象上。Windows的消息可分為四種類型:(1)輸入消息:對(duì)鍵盤和鼠標(biāo)輸入作
36、反應(yīng)。這類輸入消息首先放在系統(tǒng)消息隊(duì)列中,然后Windows將它們送入應(yīng)用程序的消息隊(duì)列,使消息得到處理。(2)控制消息:用來(lái)與Windows的特殊控制對(duì)象,例如,對(duì)話框、列表框、按鈕等進(jìn)行雙向通信。這類消息一般不通過(guò)應(yīng)用程序的消息隊(duì)列,而是直接發(fā)送到控制對(duì)象上。(3)系統(tǒng)消息:對(duì)程式化的事件或系統(tǒng)時(shí)鐘中斷作出反應(yīng)。有些系統(tǒng)消息,例如大部分DDE消息(程序間進(jìn)行動(dòng)態(tài)數(shù)據(jù)交換時(shí)所使用的消息)要通過(guò)Windows的系統(tǒng)消息隊(duì)列。而有些系統(tǒng)消息,例如窗口的創(chuàng)建及刪除等消息直接送入應(yīng)用程序的消息隊(duì)列。(4)用戶消息:這些消息是程序員創(chuàng)建的,通常,這些消息只從應(yīng)用程序的某一部分進(jìn)入到該應(yīng)用程序的另一部分
37、而被處理,不會(huì)離開(kāi)應(yīng)用程序。用戶消息經(jīng)常用來(lái)處理選單操作:一個(gè)用戶消息與選單中的一選項(xiàng)相對(duì)應(yīng),當(dāng)它在應(yīng)用程序隊(duì)列中出現(xiàn)時(shí)被處理。Windows應(yīng)用程序通過(guò)執(zhí)行一段稱為消息循環(huán)的代碼來(lái)輪詢應(yīng)用程序的消息隊(duì)列,從中檢索出該程序要處理的消息,并立即將檢索到的消息發(fā)送到有關(guān)的對(duì)象上。典型的Windows應(yīng)用程序的消息循環(huán)的形式為:MSGmsg;while (GetMessage(&msg, NULL, 0, 0L)TranslateMessage(&msg);DispatchMessage(&msg);函數(shù)GetMessage從應(yīng)用程序隊(duì)列中檢索出一條消息,并將它存于具有MSG類型的一個(gè)變量中,然后交
38、由函數(shù)TranslateMessage對(duì)該消息進(jìn)行翻譯,緊接著,函數(shù)DispatchMessage將消息發(fā)送到適當(dāng)?shù)膶?duì)象上。有關(guān)這三個(gè)函數(shù)的更多的細(xì)節(jié)在1.10節(jié)里介紹1.9、窗口對(duì)象對(duì)Windows用戶和程序員而言,窗口對(duì)象(簡(jiǎn)稱窗口)是一類非常重要的對(duì)象。尤其對(duì)程序員,窗口的定義和創(chuàng)建以及對(duì)窗口的處理過(guò)程最能直觀地反映出Windows中面向?qū)ο蟮某绦蛟O(shè)計(jì)的四個(gè)基本機(jī)制(類、對(duì)象、方法、和消息)。1.9.1 窗口類如前所述,在程序中創(chuàng)建對(duì)象,必須先定義對(duì)象所屬的類。在Windows中,窗口類是在類型為WNDCLASS的結(jié)構(gòu)變量中定義的,在Windows.h中,結(jié)構(gòu)類型WNDCLASS的說(shuō)明為
39、:typedefstructtagWNDCLASS DWORD style; /* 窗口風(fēng)格 */ WNDPROC*lpfnWndProc; /* 窗口函數(shù) */ intcbClsExtra; /* 類變量占用的存儲(chǔ)空間 */ intcbWndExtra; /* 實(shí)例變量占用的存儲(chǔ)空間 */ HINSTANCEhinstance;/* 定義該類的應(yīng)用程序?qū)嵗木浔?*/ HICONhicon;/* 圖標(biāo)對(duì)象的句柄 */ HCURSORhCursor;/* 光標(biāo)對(duì)象的句柄 */ HBRUSHhbrBackground; /* 用于擦除用戶區(qū)的刷子對(duì)象的句柄 */ LPCSTRlpszMenuNa
40、me;/* 標(biāo)識(shí)選單對(duì)象的字符串 */ LPCSTRlpszClassName; /* 標(biāo)識(shí)該類的名字的字符串 */ WNDCLASS;WNDCLASS類型有十個(gè)域,它描述了該類的窗口對(duì)象所具有的公共特征和方法。在程序中可以定義任意多的窗口類,每個(gè)類的窗口對(duì)象可以具有不同的特征。lpszClassName是類的名字,在創(chuàng)建窗口對(duì)象時(shí)用于標(biāo)識(shí)該窗口對(duì)象屬于哪個(gè)類。lpfnWndProc是指向函數(shù)的一個(gè)指針,所指向的函數(shù)應(yīng)具有下述的函數(shù)原型:LRESULTCALLBACKWndProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam);該函
41、數(shù)被稱為窗口函數(shù),其中定義了處理發(fā)送到該類的窗口對(duì)象的消息的方法。窗口函數(shù)是一個(gè)回調(diào)函數(shù),因此在定義窗口函數(shù)時(shí)要使用CALLLBACK類型進(jìn)行說(shuō)明。參數(shù)hWnd是一個(gè)窗口對(duì)象的句柄。通過(guò)該句柄,一個(gè)窗口函數(shù)可以檢測(cè)出當(dāng)前正在處理哪個(gè)窗口對(duì)象的消息。參數(shù)message是消息標(biāo)識(shí)符,參數(shù)wParam和lParam是隨同消息一起傳送來(lái)的參數(shù),隨著消息的不同,這兩個(gè)參數(shù)所表示的含義也不大相同,在定義消息時(shí)對(duì)這兩個(gè)參數(shù)的含義一同進(jìn)行定義。域hIcon、hCursor和hbrBackground分別定義窗口變成最小時(shí)所顯示的圖標(biāo)對(duì)象的句柄,當(dāng)光標(biāo)進(jìn)入該類的窗口對(duì)象的顯示區(qū)域時(shí)所顯示的光標(biāo)對(duì)象的句柄,當(dāng)需要
42、擦除用戶區(qū)域顯示的消息時(shí)所使用的刷子對(duì)象的句柄(該刷子作用的結(jié)果形成窗口用戶區(qū)的背景色)。域style規(guī)定窗口的風(fēng)格,它可用下列常量經(jīng)位或運(yùn)算之后形成:類型說(shuō)明CS_HREDRAW如果窗口的水平尺寸被改變,則重畫整個(gè)窗口CS_VREDRAW如果窗口的垂直尺寸被改變,則重畫整個(gè)窗口CS_BYTEALIGNCLIENT在字節(jié)邊界上(在X方向上)定位用戶區(qū)域的位置CS_BYTEALIGNWINDOW在字節(jié)邊界上(在X方向上)定位窗口的位置CS_DBLCLKS當(dāng)連續(xù)兩次按動(dòng)鼠標(biāo)鍵時(shí)向窗口發(fā)送該事件的消息CS_GLOBALCLASS定義該窗口類是一個(gè)全局類。全局類由應(yīng)用程序或庫(kù)建立,并且所有的應(yīng)用程序均
43、可使用全局類CS_NOCLOSE禁止系統(tǒng)選單中的Close選項(xiàng)還有其他一些常量,在后面的章節(jié)中介紹有關(guān)內(nèi)容時(shí)再進(jìn)行討論。域lpszMenuName指向一個(gè)以0字符(稱為空字符或NULL字符)結(jié)尾的字符串,用于標(biāo)識(shí)該窗口類的所有對(duì)象所使用的缺省選單對(duì)象。如果該域?yàn)镹ULL,則表示沒(méi)有缺省選單。域hInstance用于標(biāo)識(shí)定義該窗口類的應(yīng)用程序的實(shí)例句柄。每一個(gè)窗口類需要一個(gè)實(shí)例句柄來(lái)區(qū)分注冊(cè)窗口類的應(yīng)用程序或DLL,該實(shí)例句柄用于確定類屬。當(dāng)注冊(cè)窗口類的應(yīng)用程序或DLL被終止時(shí),窗口類被刪除。WNDCLASS類型規(guī)定了該類窗口對(duì)象的基本數(shù)據(jù)表示和處理消息的窗口函數(shù),但是,在有些應(yīng)用程序中,單有這
44、些是不夠的。因此,該類型提供了兩個(gè)域cbClsExtra及cbWndExtra,指示系統(tǒng)分配額外的存儲(chǔ)空間用于存儲(chǔ)一些附加數(shù)據(jù)。其中cbClsExtra定義可以為該類的所有對(duì)象共用的數(shù)據(jù)占用的存儲(chǔ)空間的大?。ㄒ宰止?jié)計(jì));而cbWndExtra用于定義該類的每個(gè)對(duì)象私用的數(shù)據(jù)占用的存儲(chǔ)空間的大?。ㄒ宰止?jié)計(jì)),一個(gè)對(duì)象可以在該私有存儲(chǔ)空間中存儲(chǔ)一些數(shù)據(jù),但該類的其他對(duì)象不能訪問(wèn)到這個(gè)對(duì)象所存儲(chǔ)的這些私用數(shù)據(jù)。而在公用存儲(chǔ)空間中所存的數(shù)據(jù)可被該類的所有對(duì)象訪問(wèn)到。函數(shù)SetClassWord/SetClassLong和GetClassWord/GetClassLong用于訪問(wèn)公用數(shù)據(jù),函數(shù)SetWi
45、ndowWord/SetWindowLong和函數(shù)GetWindowWord/GetWindowLong用于訪問(wèn)特定對(duì)象的私用數(shù)據(jù),這些函數(shù)在“窗口對(duì)象”一章討論。當(dāng)程序員設(shè)置了WNDCLASS變量的各個(gè)域之后,使用函數(shù)RegisterClass向Windows注冊(cè)這個(gè)類,至此,完成了定義一個(gè)窗口類的過(guò)程。函數(shù)RegisterClass的原型為:BOOL RegisterClass(LPWNDCLASS lpWndClass);該函數(shù)唯一的一個(gè)參數(shù)是指向WNDCLASS類型的變量的指針。函數(shù)返回非零,表示注冊(cè)成功,否則注冊(cè)失敗。不能向Windows注冊(cè)具有相同名字(lpszClassName域
46、指向相同的兩個(gè)字符串)的兩個(gè)類,否則第二次注冊(cè)失敗并被忽略。下面是定義和注冊(cè)窗口類的程序示例說(shuō)明:WNDCLASS wndclass;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,
47、 IDC_ARROW);wndclass.hbrBackground = (HBRUSH )GetStockObject( BLACK_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = Window;if (!RegisterClass(&wndclass)./ * 處理類注冊(cè)錯(cuò)誤 * /其中,WndProc是一個(gè)窗口函數(shù)名,變量hInstance存儲(chǔ)著當(dāng)前程序?qū)嵗木浔?。Windows預(yù)定義了一些圖標(biāo)、光標(biāo)和刷子對(duì)象,函數(shù)LoadIcon返回預(yù)定義的應(yīng)用程序圖標(biāo)的句柄,該圖標(biāo)由第二個(gè)參數(shù)IDI_APPLICATION來(lái)定
48、義。函數(shù)LoadCursor返回標(biāo)準(zhǔn)箭頭光標(biāo)(IDC_ARROW)的句柄,函數(shù)GetStockObject返回庫(kù)存對(duì)象中一個(gè)白色刷子(WHITE_BRUSH)的句柄。1.9.2 創(chuàng)建窗口對(duì)象在上一節(jié)中,我們介紹了窗口類的定義方法,窗口的某些特征(如窗口的顏色等)屬于窗口類中定義的,并由該窗口 類的所有實(shí)例共享。在注冊(cè)了窗口類之后,程序員使用函數(shù)CreateWindow創(chuàng)建窗口,得到窗口類的一個(gè)實(shí)例(一個(gè)窗口對(duì)象)的句柄。一個(gè)窗口可以是一個(gè)重疊式窗口,或是一個(gè)彈出式窗口,或是一個(gè)隸屬窗口,或是一個(gè)子窗口,這在使用CreateWindow函數(shù)時(shí)指定。每一個(gè)子窗口都有一個(gè)父窗口,每一個(gè)隸屬窗口都有一
49、個(gè)擁有者,這個(gè)擁有者是另一個(gè)窗口對(duì)象,彈出式窗口是一種特殊的窗口,這些內(nèi)容在“窗口對(duì)象”一章介紹。表1-1 CreateWindow 函數(shù)用途創(chuàng)建一個(gè)重疊窗口、彈出式窗口、隸屬窗口或子窗口原型HWND CreateWindow(LPCSTR lpClassName,類名,指定該窗口所屬的類。LPCSTR lpWindowName,窗口的名字,即在標(biāo)題欄中顯示的文本。DWORD dwStyle,該窗口的風(fēng)格,在后面詳細(xì)介紹。int x,窗口左上角相對(duì)于屏幕左上角的初始X坐標(biāo)。int y,窗口左上角相對(duì)于屏幕左上角的初始Y坐標(biāo)。int nWidth,窗口的寬度。int nHeight,窗口的高度。
50、HWND hWndParent,一個(gè)子窗口的父窗口的句柄,或隸屬窗口的擁有者窗口的句柄,若沒(méi)有擁有或者父窗口,則為NULL。 HMENU hMenu,選單句柄,如果為NULL,則使用類中定義的選單。如果建立的是一個(gè)子窗口,該參數(shù)是一個(gè)子窗口標(biāo)識(shí)符,使用此標(biāo)識(shí)符來(lái)區(qū)分多個(gè)窗口。 HINSTANCE hInstance,創(chuàng)建窗口對(duì)象的應(yīng)用程序的實(shí)例句柄。VOID FAR * lpParam創(chuàng)建窗口時(shí)指定的額外參數(shù)。);返回值返回值是標(biāo)識(shí)所創(chuàng)建的窗口對(duì)象的句柄,如果返回值為NULL,則窗口沒(méi)有被創(chuàng)建。函數(shù)CreateWindow的第三個(gè)參數(shù)指定窗口的風(fēng)格,表1-2是在Windows.h中定義的一些常
51、用到的風(fēng)格常量,通過(guò)將這些常量使用位運(yùn)算組合在一起,形成所要求的窗口風(fēng)格。表1-2 窗口風(fēng)格 類型說(shuō)明WS_BORDER創(chuàng)建一個(gè)有邊框的窗口WS_CAPTION創(chuàng)建一個(gè)有標(biāo)題欄的窗口WS_CHILDWINDOW(or WS_CHILD)創(chuàng)建一個(gè)子窗口(不能與WS_POPUP一起使用)WS_CLIPCHILDREN當(dāng)在父窗口內(nèi)繪制時(shí),把子窗口占據(jù)的區(qū)域剪切在外,即不在該區(qū)域內(nèi)繪圖 WS_CLIPSIBLINGS裁剪相互有關(guān)系的子窗口,不在被其它子窗口覆蓋的區(qū)域內(nèi)繪圖,僅與WS_CHILD一起使用 WS_DISABLED創(chuàng)建一個(gè)初始被禁止的窗口WS_DLGFRAME創(chuàng)建一個(gè)有雙邊框但無(wú)標(biāo)題的窗口W
52、S_HSCROLL創(chuàng)建一個(gè)帶水平滾動(dòng)杠的窗口WS_VSCROLL創(chuàng)建一個(gè)帶垂直滾動(dòng)杠的窗口WS_ICONIC創(chuàng)建一個(gè)初始為圖標(biāo)的窗口,僅可以與WS_OVERLAPPEDWINDOWS一起使用WS_MAXIMIZE創(chuàng)建一個(gè)最大尺寸的窗口WS_MINIMIZE創(chuàng)建一個(gè)最小尺寸的窗口(即圖標(biāo))WS_MAXIMIZEBOX創(chuàng)建一個(gè)帶有極大框的窗口WS_MINIMIZEBOX創(chuàng)建一個(gè)帶有極小框的窗口WS_OVERLAPPED創(chuàng)建一個(gè)重疊式窗口,重疊式窗口帶有標(biāo)題和邊框WS_POPUP創(chuàng)建一個(gè)彈出式窗口,不能與WS_CHILD一起使用WS_SYSMENU窗口帶有系統(tǒng)選單框,僅用于帶標(biāo)題欄的窗口WS_THI
53、CKFRAME創(chuàng)建一個(gè)邊框的窗口,使用戶可以直接縮放窗口WS_VISIBLE創(chuàng)建一個(gè)初始可見(jiàn)的窗口在Windows.h中,還定義了風(fēng)格WS_OVERLAPPEDWINDOW和WS_POPUPWINDOW。其中,WS_OVERLAPPEDWINDOW由下面的宏進(jìn)行定義:#define WS_OVERLAPPEDWINDOW(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)WS_POPUPWINDOW定義為:#define WS_POPUPWINDOW ( WS_BOR
54、DER | WS_POPUP | WS_SYSMENU )但是,在使用WS_POPUPWINDOW時(shí),必須組合WS_CAPTION ,否則不能使系統(tǒng)選單(WS_SYSMENU)在窗口上可見(jiàn)。另外 兩個(gè)窗口風(fēng)格是WS_GROUP和WS_TABSTOP,這兩個(gè)窗口風(fēng)格的意義在介紹對(duì)話框時(shí)進(jìn)行介紹,在介紹對(duì)話框時(shí),還將介紹其它窗口風(fēng)格。CreateWindow函數(shù)的x和y參數(shù)是窗口左上角相對(duì)于屏幕左上角的坐標(biāo)。這兩個(gè)參數(shù)可以使用常量CW_USEDFAULT,用于表示使用缺省位置。缺省時(shí),Windows顯示各個(gè)重疊窗口的位置在水平方向的垂直方向上均與屏幕左上角有一個(gè)相應(yīng)的偏移值。nWindth和nHeight參數(shù)也可以使用常量CW_USEDEFAULT來(lái)指定,這時(shí),Windows使用
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全工作測(cè)試試題及答案
- 急診調(diào)度考試試題及答案
- 注冊(cè)土木工程師必考試題及答案
- 濟(jì)南實(shí)驗(yàn)高三試題及答案
- 注冊(cè)土木工程師考試個(gè)人總結(jié)試題及答案
- 家具設(shè)計(jì)理念與實(shí)際應(yīng)用案例試題及答案
- 知識(shí)記憶大學(xué)化學(xué)考試試題及答案
- 肋骨骨折試題庫(kù)及答案
- 大學(xué)化學(xué)污染物去除技術(shù)分析試題及答案
- 家具設(shè)計(jì)中的流行趨勢(shì)與用戶體驗(yàn)提升策略研究試題及答案
- 畜牧獸醫(yī)考試題庫(kù)
- (高清版)JTG D81-2017 公路交通安全設(shè)施設(shè)計(jì)規(guī)范
- 21《楊氏之子》公開(kāi)課一等獎(jiǎng)創(chuàng)新教案
- MOOC 農(nóng)學(xué)概論-福建農(nóng)林大學(xué) 中國(guó)大學(xué)慕課答案
- 無(wú)形資產(chǎn)轉(zhuǎn)讓協(xié)議書
- 數(shù)字貿(mào)易學(xué) 課件 第8、9章 數(shù)字營(yíng)商環(huán)境、數(shù)字貿(mào)易生態(tài)圈
- 經(jīng)皮球囊擴(kuò)瓣術(shù)后冠狀動(dòng)脈急性閉塞查房
- 2023部編版小學(xué)語(yǔ)文五年級(jí)下冊(cè)每課教學(xué)反思
- 高級(jí)農(nóng)藝工試題及答案
- T-SHJ X062-2023 電動(dòng)重型卡車換電站及換電車輛技術(shù)要求
- 慢性肝病的綜合管理教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論