Windows編程基礎(chǔ) - 概述_第1頁
Windows編程基礎(chǔ) - 概述_第2頁
Windows編程基礎(chǔ) - 概述_第3頁
Windows編程基礎(chǔ) - 概述_第4頁
Windows編程基礎(chǔ) - 概述_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Windows編程基礎(chǔ)-概述作者:未知閱讀人次:96284文章來源:未知發(fā)布時間:2004-12-21網(wǎng)友評論(44)條1.1、Windows的介紹Windows是一種基于圖形界面的多任務(wù)操作系統(tǒng)。為這個環(huán)境開發(fā)的程序有著相同的外觀和命令結(jié)構(gòu)。對用戶 來說,這使得學(xué)習(xí)使用Windows應(yīng)用程序變得容易了。為了幫助開發(fā)Windows應(yīng)用程序,Windows提供了大量的內(nèi)建 函數(shù)以方便地使用彈出菜單、滾動條、對話框、圖標和其他一些友好的用戶界面應(yīng)該具有的特性。Windows運行應(yīng)用程序以硬件無關(guān)的方式來處理視頻顯示、鍵盤、鼠標、打印機、串行口以及系統(tǒng)時鐘。最值 得注意的Windows特性就是其標準

2、化的圖形用戶界面。統(tǒng)一的界面使用圖片或圖標來代表磁盤驅(qū)動器、文件、子目 錄以及其它操作系統(tǒng)的命令和動作。統(tǒng)一的用戶界面也為程序員帶來了好處。例如,你可以很方便地使用常見菜單和對話框的內(nèi)建函數(shù)。所有的菜單都具有相同風(fēng)格的鍵盤和鼠標接口,因為是Windows而不是程序員在實現(xiàn)它。Windows的多任務(wù)環(huán)境允許用戶在同一時刻運行多個應(yīng)用程序或同一個應(yīng)用程序的多個實例。一個應(yīng)用程序可 能處于激活狀態(tài)。激活的應(yīng)用程序是指它正接收用戶的輸入。因為每一個瞬間僅有一個程序能夠被處理,因此同一時間也只能有一個應(yīng)用程序處于激活狀態(tài)。但是,可以有任意個數(shù)的并行運行的任務(wù)。1.2、Windows的簡要歷史Window

3、s最初由Microsoft公司在1983年11月宣布,1985年11月推出了第一公開發(fā)行版本,即1.01版。此后兩年,1.01版進行了幾次修改以滿足國際市場的需求,并增減了一些顯示器和打印機的驅(qū)動程序。1987年11月發(fā)行的Windows 2.0版在用戶界面上做了些改進。例如:重疊式窗口的引入,還增強了鍵盤和鼠標接口,特別是增強了選單和對話框的功能(略) 1.3、用戶界面的構(gòu)件1.3.1 窗口窗口是屏幕上與一個應(yīng)用程序相關(guān)的矩形區(qū)域,它是用戶與產(chǎn)生該窗口的應(yīng)用程序之間的可視界面。對應(yīng)用程序來說,窗口是應(yīng)用程序控制下的屏幕上的一個矩形區(qū)域,應(yīng)用程序創(chuàng)建并控制窗口的所有方面。當用戶啟動一個應(yīng)用程序

4、時,一個窗口就被創(chuàng)建。每當用戶操作窗口中的對象時,程序就有所響應(yīng)。1.3.2 邊框絕大多數(shù)窗口都有一個環(huán)繞著它的邊框,邊框不僅作為窗口的邊界,它也用來指明窗口的狀態(tài),即窗口是否是一個活動窗口。當我們將鼠標指針放在邊框上按下鼠標鍵并移動鼠標時,就可以改變窗口的大小。1.3.3 標題欄標題欄位于窗口的頂部,其中顯示的文本信息用于標注程序,一般是應(yīng)用程序的名字,這便于用戶知道哪個應(yīng)用程序正在運行。標題欄的顏色反映一個窗口是否是一個活動窗口。1.3.4 控制框控制框是每個窗口左上方的小圖片,每個應(yīng)用程序都使用它。在控制圖標上單擊鼠標鍵會使Windows顯示系統(tǒng)菜單。系統(tǒng)菜單它提供了諸如還原、移動、大小

5、、最小化、最大化以及關(guān)閉這樣的標準操作。1.3.5 最小化圖標每個Windows 98及Windows NT應(yīng)用程序都在窗口的右上角顯示三個圖標。最左邊的圖標是一段短下劃線,這就是最小化圖標。它可以使用程序被最小化。1.3.6 最大化圖標最大化圖標是三個圖標中中間的那一個,看起來象兩個小窗口。使用最大化圖標可以使用應(yīng)用程序占滿整個屏幕。如果選擇了這個圖標,其它應(yīng)用程序窗口都會被蓋住。1.3.7 垂直滾動條如果有必要,應(yīng)用程序可以顯示一個垂直滾動條。垂直流動條顯示在應(yīng)用程序窗口的右邊,在兩端有兩個方向相反的箭頭。它還有一個著色的棒和一個透明的窗口塊。后者被用于顯示當前顯示內(nèi)容與整個文檔的關(guān)系。你

6、可以用滾動條來選擇顯示哪一頁。一般在任何一個箭頭上單擊一下會使顯示內(nèi)容移動一行。單擊向上箭頭下方的窗口塊并拖動它會使屏幕輸出快速更新到應(yīng)用程序屏幕輸出的任意位置。1.3.8 水平滾動條也可以顯示一個水平滾動條 。水平滾動條顯示在窗口的底部,具有與垂直滾動條類似的功能。你用它來選擇 要顯示哪些列。一般在任何一個箭頭上單擊一個會使顯示內(nèi)容移動一列。單擊向左箭頭右邊的窗口塊并拖動它會使屏幕輸出快速更新到應(yīng)用程序屏幕輸出的任意位置。1.3.9 選單欄一個可選擇的菜單條可以顯示在標題條的下方。通過菜單條來選擇菜單和子菜單。這種選擇可以通過用鼠標單擊,也可以用熱鍵組合來實現(xiàn)。熱鍵組合經(jīng)常是ALT與命令中帶

7、下劃線的字母的組合,比如File命令中的 “F”。1.3.10 用戶區(qū)通常用戶區(qū)占據(jù)了窗口最大的部分。這是應(yīng)用程序的基本輸出區(qū)域。應(yīng)當由應(yīng)用程序來復(fù)雜管理用戶區(qū)。另外,應(yīng)用程序可以輸出到用戶區(qū)。1.4、面向?qū)ο蟮乃季S方法對于程序員來說,面向?qū)ο笠馕吨浅J煜さ氖挛铮簩⑹澜缈闯墒且唤M彼此相關(guān)并相互通信的實體即對象組成,每個對象有一個名字來標識,這是人們通??创澜绲姆绞?。例如,當看見一輛汽車時,所見到的是一輛汽車,而不是一大堆原子。人們可以將汽車分解為車輪、發(fā)動機、車門、油箱等,它們都是具體的實體即對象。對象之間的通信被稱為發(fā)送消息,即一個對象請求另一個對象執(zhí)行某種方式的操作。例如,交叉路口的紅

8、燈“請求”駕駛員停車,駕駛員在接受到消息之后,他所執(zhí)行的動作是踏下制動踏板,這有向汽車發(fā)送了一條消息,汽車在接受到此消息之后,又將該消息分解之后發(fā)送到相關(guān)的對象上:制動器作用于車輪上,將動能轉(zhuǎn)變成為勢能,使車速降下來;尾燈又向它后面的其它車輛的駕駛員發(fā)送消息;各種儀表盤向駕駛員反饋出所發(fā)送的消息的動作結(jié)果。從程序員角度而言,對象是內(nèi)存中一塊有名的存儲單元。我們通常所謂的變量就是一種數(shù)據(jù)對象,但對象的概念比變量的含義更廣義,通常將對象定義成為包含有數(shù)據(jù)和代碼的內(nèi)存區(qū)域,數(shù)據(jù)表征對象的特征,而代碼用于響應(yīng)消息,使對象進行某些動作。從屏幕上顯示的一個可視的窗口對象為例,我們可以對比分析一下用戶心目中

9、的對象和程序員心目中的對象的關(guān)系。窗口對象的特征,例如顏色、長度、其中顯示的信息等,在程序中被表示為數(shù)據(jù),用戶對窗口對所做的操作,例如移動窗口、改變窗口的大小等,使得用戶向窗口發(fā)送了消息,這些消息引起了計算機(內(nèi)存中的)對象執(zhí)行相應(yīng)的代碼,代碼執(zhí)行的結(jié)果改變了對象中的數(shù)據(jù),使對應(yīng)的可以視對象 的位置和大小發(fā)生了變化。對象為響應(yīng)消息所執(zhí)行的代碼被稱為方法,對象中保存的數(shù)據(jù)構(gòu)成對象的屬性,對象的抽象定義就是執(zhí)行某些動作,否則,沒有其它途徑可以使一個對象動作起來。向一個對象發(fā)送消息在程序中表示為:functionName(id, arg1, arg2, .);其中,消息是functionName,i

10、d是標識對象的一個對象名,或稱其為對象的標識符,Windows使用某種類型的 數(shù)據(jù)來作為對象的標識符,這個標識符號常被稱為對象的句柄。arg1等為消息所帶的參數(shù)。雖然發(fā)消息類似于標準的函數(shù)調(diào)用,但消息也有函數(shù)調(diào)用中沒有的特性,例如,消息始終在執(zhí)行一選擇機制,其參數(shù)與其它消息區(qū)別開來,從而告訴該對象完成什么樣的操作。一個函數(shù)名始終指向內(nèi)存中該函數(shù)的代碼所位于的確定地址,消息并不指向內(nèi)存中的某地址,但卻告訴接受消息的對象要引用的內(nèi)存地址是什么。函數(shù)不僅說明操作,而且還要執(zhí)行如何完成該操作的方法。消息只說明該操作,在對象中定義的方法說明如何完成該操作。當向不同的對象發(fā)送相同的消息時,所執(zhí)行的方法是不

11、同的。在面向?qū)ο蟮某绦蛟O(shè)計中,每個對象由一個類來定義,類是對一組性質(zhì)相同的對象的程序描述,它是由概括了一組對象共同性質(zhì)的方法和數(shù)據(jù)組成。從一組對象中抽象出公共的方法與數(shù)據(jù),將它們保存在一個類中是面向?qū)ο蟪绦蛟O(shè)計的核心。在日常生活中,我們也以類這種方式來定義客觀對象。通過對客觀對象進行抽象,我們將性質(zhì)相同的對象歸為一類,形成概念,例如,人類、蘋果類、食品類等。通過對客觀對象分類,我們也可以更好地認識客觀對象,例如,當知道張三是一個人時,不用對張三進行更多的描述,我們已知道張三作為一個人所具有的特征和行為,因為它們已經(jīng)在“人”類中進行了描述。在面向?qū)ο蟮某绦蛑?,類被用作樣板來生產(chǎn)具有相同行為方式的

12、對象。類就像是生產(chǎn)對象的一個工廠,在生產(chǎn)對象時,對象具有類中所描述的同樣的數(shù)據(jù)結(jié)構(gòu)和方法,同時,對象的每個數(shù)據(jù)在創(chuàng)立之初取得一個初始值,形成對象的初始狀態(tài)。對象通過發(fā)送消息相互作用,對象的狀態(tài)從一種狀態(tài)過渡到另一種狀態(tài),當所有的有關(guān)對象到達某種特定的狀態(tài)時就得程序的運行結(jié)果。使用類產(chǎn)生對象的過程也稱為生成該類的一個實例。因此,對象也可以定義為對象是類的一個實例。定義類也意味著將該類的對象公用代碼放在內(nèi)存的公共區(qū)域中,而不必對每個對象都將它們的代碼和數(shù)據(jù)重新進行一次描述,這減輕了程序員的勞動強度。我們可以將一些常用對象定義放在一個公用庫中,而在程序中需要該類的一個對象時,就創(chuàng)建該類的一個實例。W

13、indows已為程序員預(yù)定義了許多像按鈕、滾動杠和對話框等對象的類,當程序員需要這些類的對象時,僅需創(chuàng)立該類的實例即可。對于同一個類的不同對象,在建立對象時其初始狀態(tài)不同,因而這些對象在屏幕上顯示的位置、大小等屬性也不相同,但同類的對象的操作是相同的(因為它們共用相同的方法)。這也就是為什么不同的Windows應(yīng)用程序?qū)τ脩舯憩F(xiàn)出一致的操作特性的原因之一。1.5、句柄Windows應(yīng)用程序中存在許多對象,例如選單、窗口、圖標、內(nèi)存對象、位圖、刷子、設(shè)備對象和程序?qū)嵗龋赪indows中,對象使用句柄進行標識,這樣,通過使用一個句柄,應(yīng)用程序可以訪問一個對象。在Windows軟件開發(fā)工具中,句

14、柄被定義為一種新的數(shù)據(jù)類型。在應(yīng)用程序中,對句柄的使用一般只有賦值(句柄可以被賦以初始值、被改變?yōu)橛糜跇俗R同類對象中的另一個對象和被用作函數(shù)的參數(shù))、與NULL進行相等比較(判定一個句柄是否為一個有效的句柄)和與標識同類對象的另一個句柄進行相等比較(判定兩個句柄是否標識同一個對象),沒有其它的運算。雖然在有的書中介紹說句柄是一個十六位的整數(shù),但實際情況并不這樣簡單,它的長度將會隨著不同的計算機平臺和Windows的發(fā)展而有所變化,例如,在32位Windows中,句柄將是一個32位的數(shù)據(jù),并且不是整數(shù)類型。一種通用句柄類型為HANDLE,在Windows 3.1以前的版本中,它可被用于標識所有種

15、類的對象,在Windows 3.1中,部分地保留了這一特點,在本教程的程序中也有所反映。在Windows 3.1中,從HANDLE類型又派生出了一些新的句柄數(shù)據(jù)類型,每種類型的句柄用于標識一種類型的對象,下面是一些常見的句柄類型:類型說明HANDLE通用句柄類型HWND標識一個窗口對象HDC標識一個設(shè)備對象HMENU標識一個選單對象HICON標識一個圖標對象HCURSOR標識一個光標對象HBRUSH標識一個刷子對象HPEN標識一個筆對象HFONT標識一個字體對象HINSTANCE標識一個應(yīng)用程序模塊的一個實例HLOCAL標識一個局部內(nèi)存對象HGLOBAL標識一個全局內(nèi)存對象1.6、數(shù)據(jù)類型及常

16、量為便于開發(fā)Windows應(yīng)用程序,Windows的開發(fā)者新定義了一些數(shù)據(jù)類型。這些數(shù)據(jù)類型或是與C/C+中已有的數(shù)據(jù)類型同義,或是一些新的結(jié)構(gòu)數(shù)據(jù)類型。引入這些類型的主要目的是為便于程序員開發(fā)Windows應(yīng)用程序,同時也是為了增強程序的可讀性;另一個目的是為了便于程序?qū)砟鼙灰浦驳狡渌N類的計算機平臺上或適應(yīng)Windows將來的新版本的變化。例如,本教程目前使用16位API(Application Program Interface),現(xiàn)在Windows的版本使用32位API,只要將HANDLE等句柄類型定義為32位長,然后重新編譯程序,就可以很方便地將一個使用16位API的Windows

17、應(yīng)用程序改為使用32位API的程序,使其能運行在32位API Windows上。大部分的數(shù)據(jù)類型在Windows.h中定義,下面是在這個文件中定義的部分類型:#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)類型的名字也使用大寫形式的標識符:類型說明MSG消息結(jié)構(gòu)WNDCLASS窗口的類的結(jié)構(gòu)PAINTSTRUCT繪圖結(jié)構(gòu)POINT點的坐標的結(jié)構(gòu)RECT矩形結(jié)構(gòu)我們在這里以類型MSG為例來說明類型的定義方法,對于其它類型,在以后用到時再作詳細地說明。類型MSG是一個消息結(jié)構(gòu),它的定義方式及其各域的含義如下:typedef struct tagMSG HWNDhWnd;/ 窗口對象的標識符,該條消息傳遞到它所標識的窗口上 UINT

19、 message;/ 消息標識符,標識某個特定的消息 WPARAMwParam;/ 隨同消息傳遞的16位參數(shù) LPARAMlParam;/ 隨同消息傳遞的32位參數(shù) DWORD time;/ 消息產(chǎn)生的時間 POINT pt;/ 產(chǎn)生消息時光標在屏幕上的坐標 MSG;typedefMSGFAR*LPMSG;其中的POINT類型的定義是:typedefstructtagPOINT int x; /* X坐標 */int y;/* Y坐標 */ POINT; typedefPOINTFAR*LPPOINT;Windows.h在定義大部分類型的同時,還定義了該類型的指針類型。例如,上例中的LPPOI

20、NT和LPMSG等,其中字母前綴LP表示遠指針類型;若使用NP作為一個類型的前綴,則表示近指針類型;若使用P作為一個類型的前綴時,則表示一般的指針類型,這時由編譯程序時所使用的內(nèi)存模塊決定這種指針是遠指針或是近指針。在Windows.h中說明的大部分指針類型都采用這里介紹的方法進行說明,例如,LPRECT,它表示一個RECT類型的遠指針。在Windows.h中說明的大部分指針類型使用了C/C+的關(guān)鍵字const,如果一個指針類型的名字前綴為LPC、NPC或PC,則其中的字母C表示這種類型的指針變量所指向的變量不能通過該指針變量來修改,這種指針類型一般采用下述方法進行說明:typedefcons

21、tPOINTFAR* LPCPOINT;typedefconstRECFAR* LPCRECT;一個使用const修飾的指針(稱其為const指針)可以指向沒有使用const修飾的變量,但沒有使用const修飾的指針不能指向const修飾的變量,例如:constPOINTpt;LPCPOINTlpPoint = &pt;/ 正確LPPOINT lpPoint = &pt;/ 錯誤當向函數(shù)傳遞參數(shù)時,必須特別注意這個問題,例如:voidfun(LPPOINT lppt) ;.LPCPOINT lpPoint ;fun(lpPoint) ;編譯器將指示這個函數(shù)調(diào)用語句是錯誤的。所以,在一個函數(shù)不修

22、改一個指針參數(shù)所指向的變量的情況下,最好將該參數(shù)說明為const指針,使const類型的指針也能用于該函數(shù)的參數(shù)。Windows.h中說明的大部分函數(shù)使用了const指針參數(shù)。在Windows.h中,大多數(shù)語句是用于定義一個常量,例如:#denfineWM_QUIT0X0012該語句用標識符WM_QUIT來表示編號為0X0012的消息。每個常量由一個前綴和表示其含義的單詞組成的標識符組成,兩者之間用下畫線隔開。前綴表明這些常量所屬的一般范疇。下面是一些前綴和它們所屬的范疇的說明。類型說明CS窗口類的風(fēng)格(Class Style)IDI預(yù)定義的圖標對象的標識符(IDentity of Icon)

23、IDC預(yù)定義的光標對象的標識符(IDentity of Cursor)WS窗口的風(fēng)格(Windows Style)CW創(chuàng)建窗口(Create Windows)WM窗口消息(Windows Message)DT繪制文本(Drawing Text)在變量名的表示方法方面,Windows推薦使用一種稱為“匈牙利表示法”的方法。每個變量名用小寫字母或描述了變量的數(shù)據(jù)類型的字母作為前綴,變量的名字緊跟其后,且用大寫字母開始的單詞(一個或多個單詞)表示其含義,這樣每個變量都能附加上其數(shù)據(jù)類型的助記符。例如:WORDwOffset ;/* w表示W(wǎng)ORD類型 */DWORD dwValue ;/* dw表示

24、DWORD類型 */下面是Windows中常使用的一些字母前綴和它們所代表的數(shù)據(jù)類型:類型說明bBOOL,布爾類型byBYTE類型cchar類型dwDWORD類型fn函數(shù)類型i整型lLONG類型lp遠(長)指針(long pointer)n短整型np近(短)指針(near pointer)p指針s字符串sz以0結(jié)尾的字符串wWORD類型xshort,用于表示X坐標時yshort,用于表示Y坐標時Windows程序員也可以根據(jù)上述思想和使用目的,發(fā)明一些其他的前綴,但要注意,對這些前綴的使用必須保持前后一致。在Windows中,所有的函數(shù)根據(jù)其用途來命名,它們一般由2到3個英文單詞組成,每個單詞

25、的第一個字母大寫,例如,函數(shù)CreateWindow(),由該函數(shù)的名字可以知道它的用途是創(chuàng)建一個窗口。1.7、應(yīng)用程序使用的一些術(shù)語本節(jié)介紹Winodws應(yīng)用程序使用的一些術(shù)語及其相關(guān)概念,在后面的章節(jié)中介紹有關(guān)的內(nèi)容時,再對其中的概念進行詳細的討論。1.7.1 模塊在Windows中,術(shù)語“模塊”一般是指任何能被裝入內(nèi)存中運行的可執(zhí)行代碼和數(shù)據(jù)的集合。更明確地講,模塊指的就是一個.EXE文件(又稱為應(yīng)用程序模塊),或一個動態(tài)鏈接庫(DLL Dynamic Linking Library,又被稱為動態(tài)鏈接庫模塊或DLL模塊),或一個設(shè)備驅(qū)動程序,也可能是一個程序包含的能被另一個程序存取的數(shù)據(jù)

26、資源。模塊一詞也被用于特指自包含的一段程序。例如,一個可單獨編譯的源文件,或該源文件被編譯器處理之后所生成的目標程序。當制作一個程序時,模塊一詞用于指被連接在一起的許多模塊中的某個模塊。Windows本身由幾個相關(guān)的模塊組成,Windows API函數(shù)就是在Windows啟動時裝入內(nèi)存中的幾個動態(tài)鏈接庫模塊實現(xiàn)的。其中的三個主要模塊是USER.EXE(用于窗口管理等)、KERNEL.EXE(用于內(nèi)存管理的多任務(wù)調(diào)度)和GDI.EXE(圖形設(shè)備接口,用于圖形輸出等)。1.7.2 應(yīng)用程序一個Windows應(yīng)用程序是被Windows調(diào)用或在Windows下運行的一個程序,這個程序可以調(diào)用靜態(tài)連接庫

27、(也就是C的運行時間庫)中的函數(shù)和DLL的函數(shù),它也可以啟動其它的應(yīng)用程序。一個應(yīng)用程序在運行時的輸入被Windows捕獲,并以消息的形式傳送到應(yīng)用程序的活動窗口上。一個應(yīng)用程序的輸出也是通過Windows進行的,所有的輸出首先被送給Windows。許多MS-DOS應(yīng)用程序基本上占據(jù)整個計算機,并認為所有的計算機資源只屬于該應(yīng)用程序,應(yīng)用程序告訴相對被動的MS-DOS應(yīng)做什么。在一個Windows應(yīng)用程序中,Windows自身是非常主動的,并且和應(yīng)用程序協(xié)同得非常緊密。Windows管理著計算機的所有資源,并調(diào)度這些資源,使它們可為正在Windows上運行的所有應(yīng)用程序共享。1.7.3 任務(wù)和

28、實例Windows將運行的應(yīng)用程序?qū)嵗鳛椴煌娜蝿?wù)。當一個應(yīng)用程序的多個實例在運行時,它們也被Windows當作不同的任務(wù)。Windows為一個模塊的每一個實例都裝入一個缺省數(shù)據(jù)段,但可執(zhí)行代碼只能裝入一次。也就是說,同一個模塊的實例共享相同的代碼,但有自己私用的數(shù)據(jù)段。對每一個模塊、任務(wù)或?qū)嵗琖indows分別使用一個句柄來標識它。在窗口對象的私有數(shù)據(jù)存儲區(qū)存儲有一個應(yīng)用程序的任務(wù)句柄、實例句柄和模塊句柄。任務(wù)句柄被Windows的任務(wù)調(diào)度程序用于進行任務(wù)調(diào)度。通過模塊句柄,Windows可以知道一個模塊當前有多少實例正在運行。同一個模塊的不同實例有相同的模塊句柄,但有不同的任務(wù)和實例句

29、柄。當Windows由于內(nèi)存管理的需要而廢棄了一個實例的代碼段時,通過模塊句柄,Windows可以從模塊中重新裝入這個實例所需的代碼。1.7.4 動態(tài)鏈接庫DLL是一種有別于MS-DOS應(yīng)用程序所使用的庫模塊(例如 C的運行時間庫)的一種特殊的庫模塊,它含有可能 被其它應(yīng)用程序調(diào)用的函數(shù)。一個DLL在運行時被動態(tài)地連接到一個應(yīng)用程序中或另一個DLL中,而不是在制作應(yīng)用程序時靜態(tài)地連接到應(yīng)用程序中的(這種方法是在制作MS-DOS應(yīng)用程序中使用的方法,它們在Windows應(yīng)用程序中仍然可以繼續(xù)被使用)。使用DLL的好處在于,當有多個應(yīng)用程序使用同一個DLL并且同時在Windows中運行時,該DLL

30、在內(nèi)存中只有一個實例。1.7.5 應(yīng)用程序設(shè)計接口應(yīng)用程序設(shè)計接口(API)是應(yīng)用程序用于操作周圍環(huán)境的一組函數(shù)調(diào)用接口。Windows API大約有600多個函 數(shù),學(xué)習(xí)Windows程序設(shè)計的許多工作就是學(xué)習(xí)如何使用這些API。1.7.6 Windows下的函數(shù)在進行Windows應(yīng)用程序設(shè)計中,程序員除了需要知道有關(guān)一個函數(shù)的常用信息(例如函數(shù)的名字,近函數(shù)或遠函數(shù),返回類型以及應(yīng)如何調(diào)用)之外,同時還要知道更多的內(nèi)容:一個回調(diào)函數(shù)、引出函數(shù)或是一個引入函數(shù)。引出函數(shù):這個術(shù)語與一個函數(shù)如何在一個模塊中說明而在另一個模塊中被調(diào)用有關(guān)。引出函數(shù)是在一個模塊中定義而在這個模塊之外被調(diào)用的一種

31、函數(shù);或是被Windows或是被另一個模塊調(diào)用。這些函數(shù)必須以一種特定的方式進行說明,并被編譯器作特殊的處理。這樣,當它們被調(diào)用時,它們會被正確地束定到合適的數(shù)據(jù)段上。DLL為其它模塊提供要被調(diào)用的函數(shù),因此,每個DLL一般都帶有一個DLL庫,以便應(yīng)用程序可以合法地調(diào)用DLL中的函數(shù)。DLL庫由DLL中每個引出函數(shù)的入口點組成。整個Windows API就是由構(gòu)成Windows環(huán)境的不同的模塊所引出的函數(shù)組成,這些API函數(shù)的入口點在一個名為IMPORT.LIB的DLL庫中說明。引入函數(shù):在DLL中引出的函數(shù)若要能為一個模塊調(diào)用,必須在這個模塊中將這個函數(shù)說明為引入函數(shù)。由此可見引出函數(shù)和引入

32、函數(shù)表達的是從兩種角度處理同一個函數(shù)的術(shù)語:引出模塊中的一個函數(shù)使得這個函數(shù)能被其它模塊調(diào)用;調(diào)用引出函數(shù)的模塊通過引入這個函數(shù)才能調(diào)用它。在制作Windows應(yīng)用程序時,連接器自動包含一個名為IMPORT.LIB的庫文件。這個文件允許應(yīng)用程序調(diào)用Windows API中的函數(shù)。這個文件被稱為引入庫。引入庫提供了應(yīng)用程序與一個到多個DLL中可被這個應(yīng)用程序調(diào)用的函數(shù)之間的連接。回調(diào)函數(shù):回調(diào)函數(shù)是一種特殊的引出函數(shù),是由 Windows環(huán)境直接調(diào)用的函數(shù)。一個應(yīng)用程序至少要有一個回調(diào)函數(shù)。當一條消息要交給應(yīng)用程序處理時,Windows調(diào)用這個回調(diào)函數(shù)。這個函數(shù)對應(yīng)于一個活動窗口,被稱為這個窗口

33、的窗口函數(shù)。因為許多應(yīng)用程序至少建立一個窗口,并且Windows需要向這個窗口發(fā)送消息,所以,處理消息的函數(shù)必須由Windows調(diào)用。在請求Windows枚舉它所維護的對象時,例如字體或窗口,Windows也要調(diào)用應(yīng)用程序中的回調(diào)函數(shù)。當向Windows提出這樣的請求時,就必須向Windows提供回調(diào)函數(shù)的地址。由于引出函數(shù)是在不同的模塊中被調(diào)用的,也就是說,調(diào)用者的代碼段與被調(diào)用的引出函數(shù)的代碼段不在同一個段中,因此,在所開發(fā)的Windows應(yīng)用程序中,引出函數(shù)都被說明為遠函數(shù)。為了程序運行的效率原因,引出函數(shù)都使用Pascal調(diào)用約定,這種調(diào)用約定不同于C調(diào)用約定的地方在于: 最左邊的參數(shù)

34、先入棧:Pascal調(diào)用約定的參數(shù)進入棧的順序是函數(shù)調(diào)用中最左邊的參數(shù)先入棧。C的調(diào)用約定與此相反,它采用最右邊的參數(shù)先入棧。 被調(diào)用的函數(shù)負責從展中清除參數(shù):Pascal調(diào)用約定的函數(shù)在返回時負責清除棧中的參數(shù);C調(diào)用約定的函數(shù)不作這種工作,而由調(diào)用者來作;這樣,當程序中調(diào)用了大量的使用C調(diào)用約定的函數(shù)時,為清除棧中的參數(shù),在程序中要額外地增加許多代碼。 全局標識符不保持原來的大小寫(一般被為大寫形式),也不在標識符前面加下劃線。 為便于程序開發(fā)活動,在Windows.h中定義了兩個類型名,用于在程序說明引出函數(shù):類型說明WINAPI等價于FAR PASCAL,說明該函數(shù)是一個引出函數(shù),這個

35、類型名只用于在DLL中說明引出函數(shù),或在應(yīng)用程序中對DLL中的引出函數(shù)進行函數(shù)說明時。CALLBACK等價于FAR PASCAL,說明該函數(shù)是一個回調(diào)函數(shù),它常被用在應(yīng)用程序模塊中說明一個窗口函數(shù)或其它種類的回調(diào)函數(shù)。1.8、事件和消息在Windows中,用戶或系統(tǒng)中所發(fā)生的任何活動被當作事件來處理,例如,用戶按下了鼠標按鈕,就產(chǎn)生一鼠標事件。對于所發(fā)生的每一個事件,Windows將其轉(zhuǎn)換成消息的形式放在一個稱為消息隊列的內(nèi)存區(qū)中,然后由Windows的消息發(fā)送程序選擇適合的對象,將消息隊列中的消息發(fā)送到欲接受消息的對象上。Windows的消息可分為四種類型:(1)輸入消息:對鍵盤和鼠標輸入作

36、反應(yīng)。這類輸入消息首先放在系統(tǒng)消息隊列中,然后Windows將它們送入應(yīng)用程序的消息隊列,使消息得到處理。(2)控制消息:用來與Windows的特殊控制對象,例如,對話框、列表框、按鈕等進行雙向通信。這類消息一般不通過應(yīng)用程序的消息隊列,而是直接發(fā)送到控制對象上。(3)系統(tǒng)消息:對程式化的事件或系統(tǒng)時鐘中斷作出反應(yīng)。有些系統(tǒng)消息,例如大部分DDE消息(程序間進行動態(tài)數(shù)據(jù)交換時所使用的消息)要通過Windows的系統(tǒng)消息隊列。而有些系統(tǒng)消息,例如窗口的創(chuàng)建及刪除等消息直接送入應(yīng)用程序的消息隊列。(4)用戶消息:這些消息是程序員創(chuàng)建的,通常,這些消息只從應(yīng)用程序的某一部分進入到該應(yīng)用程序的另一部分

37、而被處理,不會離開應(yīng)用程序。用戶消息經(jīng)常用來處理選單操作:一個用戶消息與選單中的一選項相對應(yīng),當它在應(yīng)用程序隊列中出現(xiàn)時被處理。Windows應(yīng)用程序通過執(zhí)行一段稱為消息循環(huán)的代碼來輪詢應(yīng)用程序的消息隊列,從中檢索出該程序要處理的消息,并立即將檢索到的消息發(fā)送到有關(guān)的對象上。典型的Windows應(yīng)用程序的消息循環(huán)的形式為:MSGmsg;while (GetMessage(&msg, NULL, 0, 0L)TranslateMessage(&msg);DispatchMessage(&msg);函數(shù)GetMessage從應(yīng)用程序隊列中檢索出一條消息,并將它存于具有MSG類型的一個變量中,然后交

38、由函數(shù)TranslateMessage對該消息進行翻譯,緊接著,函數(shù)DispatchMessage將消息發(fā)送到適當?shù)膶ο笊稀S嘘P(guān)這三個函數(shù)的更多的細節(jié)在1.10節(jié)里介紹1.9、窗口對象對Windows用戶和程序員而言,窗口對象(簡稱窗口)是一類非常重要的對象。尤其對程序員,窗口的定義和創(chuàng)建以及對窗口的處理過程最能直觀地反映出Windows中面向?qū)ο蟮某绦蛟O(shè)計的四個基本機制(類、對象、方法、和消息)。1.9.1 窗口類如前所述,在程序中創(chuàng)建對象,必須先定義對象所屬的類。在Windows中,窗口類是在類型為WNDCLASS的結(jié)構(gòu)變量中定義的,在Windows.h中,結(jié)構(gòu)類型WNDCLASS的說明為

39、:typedefstructtagWNDCLASS DWORD style; /* 窗口風(fēng)格 */ WNDPROC*lpfnWndProc; /* 窗口函數(shù) */ intcbClsExtra; /* 類變量占用的存儲空間 */ intcbWndExtra; /* 實例變量占用的存儲空間 */ HINSTANCEhinstance;/* 定義該類的應(yīng)用程序?qū)嵗木浔?*/ HICONhicon;/* 圖標對象的句柄 */ HCURSORhCursor;/* 光標對象的句柄 */ HBRUSHhbrBackground; /* 用于擦除用戶區(qū)的刷子對象的句柄 */ LPCSTRlpszMenuNa

40、me;/* 標識選單對象的字符串 */ LPCSTRlpszClassName; /* 標識該類的名字的字符串 */ WNDCLASS;WNDCLASS類型有十個域,它描述了該類的窗口對象所具有的公共特征和方法。在程序中可以定義任意多的窗口類,每個類的窗口對象可以具有不同的特征。lpszClassName是類的名字,在創(chuàng)建窗口對象時用于標識該窗口對象屬于哪個類。lpfnWndProc是指向函數(shù)的一個指針,所指向的函數(shù)應(yīng)具有下述的函數(shù)原型:LRESULTCALLBACKWndProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam);該函

41、數(shù)被稱為窗口函數(shù),其中定義了處理發(fā)送到該類的窗口對象的消息的方法。窗口函數(shù)是一個回調(diào)函數(shù),因此在定義窗口函數(shù)時要使用CALLLBACK類型進行說明。參數(shù)hWnd是一個窗口對象的句柄。通過該句柄,一個窗口函數(shù)可以檢測出當前正在處理哪個窗口對象的消息。參數(shù)message是消息標識符,參數(shù)wParam和lParam是隨同消息一起傳送來的參數(shù),隨著消息的不同,這兩個參數(shù)所表示的含義也不大相同,在定義消息時對這兩個參數(shù)的含義一同進行定義。域hIcon、hCursor和hbrBackground分別定義窗口變成最小時所顯示的圖標對象的句柄,當光標進入該類的窗口對象的顯示區(qū)域時所顯示的光標對象的句柄,當需要

42、擦除用戶區(qū)域顯示的消息時所使用的刷子對象的句柄(該刷子作用的結(jié)果形成窗口用戶區(qū)的背景色)。域style規(guī)定窗口的風(fēng)格,它可用下列常量經(jīng)位或運算之后形成:類型說明CS_HREDRAW如果窗口的水平尺寸被改變,則重畫整個窗口CS_VREDRAW如果窗口的垂直尺寸被改變,則重畫整個窗口CS_BYTEALIGNCLIENT在字節(jié)邊界上(在X方向上)定位用戶區(qū)域的位置CS_BYTEALIGNWINDOW在字節(jié)邊界上(在X方向上)定位窗口的位置CS_DBLCLKS當連續(xù)兩次按動鼠標鍵時向窗口發(fā)送該事件的消息CS_GLOBALCLASS定義該窗口類是一個全局類。全局類由應(yīng)用程序或庫建立,并且所有的應(yīng)用程序均

43、可使用全局類CS_NOCLOSE禁止系統(tǒng)選單中的Close選項還有其他一些常量,在后面的章節(jié)中介紹有關(guān)內(nèi)容時再進行討論。域lpszMenuName指向一個以0字符(稱為空字符或NULL字符)結(jié)尾的字符串,用于標識該窗口類的所有對象所使用的缺省選單對象。如果該域為NULL,則表示沒有缺省選單。域hInstance用于標識定義該窗口類的應(yīng)用程序的實例句柄。每一個窗口類需要一個實例句柄來區(qū)分注冊窗口類的應(yīng)用程序或DLL,該實例句柄用于確定類屬。當注冊窗口類的應(yīng)用程序或DLL被終止時,窗口類被刪除。WNDCLASS類型規(guī)定了該類窗口對象的基本數(shù)據(jù)表示和處理消息的窗口函數(shù),但是,在有些應(yīng)用程序中,單有這

44、些是不夠的。因此,該類型提供了兩個域cbClsExtra及cbWndExtra,指示系統(tǒng)分配額外的存儲空間用于存儲一些附加數(shù)據(jù)。其中cbClsExtra定義可以為該類的所有對象共用的數(shù)據(jù)占用的存儲空間的大?。ㄒ宰止?jié)計);而cbWndExtra用于定義該類的每個對象私用的數(shù)據(jù)占用的存儲空間的大?。ㄒ宰止?jié)計),一個對象可以在該私有存儲空間中存儲一些數(shù)據(jù),但該類的其他對象不能訪問到這個對象所存儲的這些私用數(shù)據(jù)。而在公用存儲空間中所存的數(shù)據(jù)可被該類的所有對象訪問到。函數(shù)SetClassWord/SetClassLong和GetClassWord/GetClassLong用于訪問公用數(shù)據(jù),函數(shù)SetWi

45、ndowWord/SetWindowLong和函數(shù)GetWindowWord/GetWindowLong用于訪問特定對象的私用數(shù)據(jù),這些函數(shù)在“窗口對象”一章討論。當程序員設(shè)置了WNDCLASS變量的各個域之后,使用函數(shù)RegisterClass向Windows注冊這個類,至此,完成了定義一個窗口類的過程。函數(shù)RegisterClass的原型為:BOOL RegisterClass(LPWNDCLASS lpWndClass);該函數(shù)唯一的一個參數(shù)是指向WNDCLASS類型的變量的指針。函數(shù)返回非零,表示注冊成功,否則注冊失敗。不能向Windows注冊具有相同名字(lpszClassName域

46、指向相同的兩個字符串)的兩個類,否則第二次注冊失敗并被忽略。下面是定義和注冊窗口類的程序示例說明: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)./ * 處理類注冊錯誤 * /其中,WndProc是一個窗口函數(shù)名,變量hInstance存儲著當前程序?qū)嵗木浔?。Windows預(yù)定義了一些圖標、光標和刷子對象,函數(shù)LoadIcon返回預(yù)定義的應(yīng)用程序圖標的句柄,該圖標由第二個參數(shù)IDI_APPLICATION來定

48、義。函數(shù)LoadCursor返回標準箭頭光標(IDC_ARROW)的句柄,函數(shù)GetStockObject返回庫存對象中一個白色刷子(WHITE_BRUSH)的句柄。1.9.2 創(chuàng)建窗口對象在上一節(jié)中,我們介紹了窗口類的定義方法,窗口的某些特征(如窗口的顏色等)屬于窗口類中定義的,并由該窗口 類的所有實例共享。在注冊了窗口類之后,程序員使用函數(shù)CreateWindow創(chuàng)建窗口,得到窗口類的一個實例(一個窗口對象)的句柄。一個窗口可以是一個重疊式窗口,或是一個彈出式窗口,或是一個隸屬窗口,或是一個子窗口,這在使用CreateWindow函數(shù)時指定。每一個子窗口都有一個父窗口,每一個隸屬窗口都有一

49、個擁有者,這個擁有者是另一個窗口對象,彈出式窗口是一種特殊的窗口,這些內(nèi)容在“窗口對象”一章介紹。表1-1 CreateWindow 函數(shù)用途創(chuàng)建一個重疊窗口、彈出式窗口、隸屬窗口或子窗口原型HWND CreateWindow(LPCSTR lpClassName,類名,指定該窗口所屬的類。LPCSTR lpWindowName,窗口的名字,即在標題欄中顯示的文本。DWORD dwStyle,該窗口的風(fēng)格,在后面詳細介紹。int x,窗口左上角相對于屏幕左上角的初始X坐標。int y,窗口左上角相對于屏幕左上角的初始Y坐標。int nWidth,窗口的寬度。int nHeight,窗口的高度。

50、HWND hWndParent,一個子窗口的父窗口的句柄,或隸屬窗口的擁有者窗口的句柄,若沒有擁有或者父窗口,則為NULL。 HMENU hMenu,選單句柄,如果為NULL,則使用類中定義的選單。如果建立的是一個子窗口,該參數(shù)是一個子窗口標識符,使用此標識符來區(qū)分多個窗口。 HINSTANCE hInstance,創(chuàng)建窗口對象的應(yīng)用程序的實例句柄。VOID FAR * lpParam創(chuàng)建窗口時指定的額外參數(shù)。);返回值返回值是標識所創(chuàng)建的窗口對象的句柄,如果返回值為NULL,則窗口沒有被創(chuàng)建。函數(shù)CreateWindow的第三個參數(shù)指定窗口的風(fēng)格,表1-2是在Windows.h中定義的一些常

51、用到的風(fēng)格常量,通過將這些常量使用位運算組合在一起,形成所要求的窗口風(fēng)格。表1-2 窗口風(fēng)格 類型說明WS_BORDER創(chuàng)建一個有邊框的窗口WS_CAPTION創(chuàng)建一個有標題欄的窗口WS_CHILDWINDOW(or WS_CHILD)創(chuàng)建一個子窗口(不能與WS_POPUP一起使用)WS_CLIPCHILDREN當在父窗口內(nèi)繪制時,把子窗口占據(jù)的區(qū)域剪切在外,即不在該區(qū)域內(nèi)繪圖 WS_CLIPSIBLINGS裁剪相互有關(guān)系的子窗口,不在被其它子窗口覆蓋的區(qū)域內(nèi)繪圖,僅與WS_CHILD一起使用 WS_DISABLED創(chuàng)建一個初始被禁止的窗口WS_DLGFRAME創(chuàng)建一個有雙邊框但無標題的窗口W

52、S_HSCROLL創(chuàng)建一個帶水平滾動杠的窗口WS_VSCROLL創(chuàng)建一個帶垂直滾動杠的窗口WS_ICONIC創(chuàng)建一個初始為圖標的窗口,僅可以與WS_OVERLAPPEDWINDOWS一起使用WS_MAXIMIZE創(chuàng)建一個最大尺寸的窗口WS_MINIMIZE創(chuàng)建一個最小尺寸的窗口(即圖標)WS_MAXIMIZEBOX創(chuàng)建一個帶有極大框的窗口WS_MINIMIZEBOX創(chuàng)建一個帶有極小框的窗口WS_OVERLAPPED創(chuàng)建一個重疊式窗口,重疊式窗口帶有標題和邊框WS_POPUP創(chuàng)建一個彈出式窗口,不能與WS_CHILD一起使用WS_SYSMENU窗口帶有系統(tǒng)選單框,僅用于帶標題欄的窗口WS_THI

53、CKFRAME創(chuàng)建一個邊框的窗口,使用戶可以直接縮放窗口WS_VISIBLE創(chuàng)建一個初始可見的窗口在Windows.h中,還定義了風(fēng)格WS_OVERLAPPEDWINDOW和WS_POPUPWINDOW。其中,WS_OVERLAPPEDWINDOW由下面的宏進行定義:#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時,必須組合WS_CAPTION ,否則不能使系統(tǒng)選單(WS_SYSMENU)在窗口上可見。另外 兩個窗口風(fēng)格是WS_GROUP和WS_TABSTOP,這兩個窗口風(fēng)格的意義在介紹對話框時進行介紹,在介紹對話框時,還將介紹其它窗口風(fēng)格。CreateWindow函數(shù)的x和y參數(shù)是窗口左上角相對于屏幕左上角的坐標。這兩個參數(shù)可以使用常量CW_USEDFAULT,用于表示使用缺省位置。缺省時,Windows顯示各個重疊窗口的位置在水平方向的垂直方向上均與屏幕左上角有一個相應(yīng)的偏移值。nWindth和nHeight參數(shù)也可以使用常量CW_USEDEFAULT來指定,這時,Windows使用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論