版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、吉林大學(xué)遠(yuǎn)程教育課件,Windows A P I編 程,主講人 : 翟慧杰,學(xué) 時(shí):48,(第一講),前 言,Windows操作系統(tǒng)是當(dāng)今世界上最為流行的操作系統(tǒng)之一,幾乎每個(gè)臺(tái)式機(jī)用戶都使用過Windows,用過Windows平臺(tái)下的應(yīng)用軟件。計(jì)算機(jī)業(yè)界對基于Windows應(yīng)用軟件的巨大需求刺激了Windows本身不斷更新,同時(shí)也刺激了開發(fā)Windows應(yīng)用軟件的程序員隊(duì)伍不斷壯大。,前 言 (二),Window
2、s操作系統(tǒng)同時(shí)也是一個(gè)大的函數(shù)庫,其中包含了數(shù)以千計(jì)的函數(shù),這些函數(shù)能完成各種各樣的功能,包括窗口管理、圖形設(shè)備接口、媒體控制、內(nèi)存管理和系統(tǒng)擴(kuò)展,這些函數(shù)都被封裝在一個(gè)接口中,這個(gè)接口就是Windows應(yīng)用程序編程接口(Windows Application Progrmming Interface),簡稱Windows API。可以說,用戶需要實(shí)現(xiàn)的所有功能通過Windows API都能實(shí)現(xiàn)。而且, Windows API作為操作系
3、統(tǒng)不可分割的一部分,很好地體現(xiàn)了 Windows操作系統(tǒng)的特色。并且基于 Windows API的應(yīng)用程序具有和 Windows操作系統(tǒng)的良好整合性,從而大大提高了軟件的運(yùn)行性能。,前 言 (三),Windows API也是認(rèn)識(shí)Windows操作系統(tǒng)的一面鏡子,通過它,用戶可以深入系統(tǒng)地掌握Windows的方方面面。很難想象,一個(gè)程序員在沒有掌握Windows API的情況下,能編制出很好的基于Windows的應(yīng)用程序來。本課件較為
4、全面地介紹了Windows API的編程結(jié)構(gòu)及其在各個(gè)方面的具體應(yīng)用,分析了大量的Windows API數(shù)據(jù)結(jié)構(gòu)和函數(shù),并結(jié)合實(shí)際應(yīng)用,精心安排了大量的程序?qū)嵗?。讀者不僅可以通過函數(shù)的分析說明來認(rèn)識(shí) Windows API,而且還可以通過編程實(shí)踐來認(rèn)識(shí)Windows API。書中所有的例子都在Windows 98\2000系統(tǒng)平臺(tái)、 Visual C++ 6.0編譯環(huán)境中經(jīng)過了嚴(yán)格的測試。,第一章 Windows程序設(shè)計(jì)概述,W
5、indows和Windows應(yīng)用程序最大的優(yōu)點(diǎn)就是用戶界面的一致性。因?yàn)榇蠖鄶?shù)用戶都在不同的軟件包上工作,而每一個(gè)軟件包都有自己的用戶界面,所以用戶界面一致性的設(shè)計(jì)就顯得非常重要。Windows環(huán)境中的每一個(gè)窗口都包含了相同的基本特性,由于這些基本特性在應(yīng)用程序中是一致的,因而用戶能很容易地適應(yīng)新的應(yīng)用程序。 對用戶的另一個(gè)好處是使用了基于圖形的圖標(biāo)來代表應(yīng)用程序和數(shù)據(jù)。由于Windows是一個(gè)圖形用戶界面,因而采用了圖形圖像來
6、代表諸如文件、應(yīng)用程序、窗口和目錄等物理數(shù)據(jù)結(jié)構(gòu)。用戶可以通過鼠標(biāo)的單擊、雙擊及拖動(dòng)等操作來管理這些物理結(jié)構(gòu)。例如,對用戶來說,雙擊一個(gè)代表某一應(yīng)用程序的圖標(biāo)比起在DOS中進(jìn)入相應(yīng)的目錄,并鍵人相應(yīng)的應(yīng)用程序名來使之執(zhí)行要容易得多。,第一章 Windows程序設(shè)計(jì)概述(二),Windows操作系統(tǒng)提供的“所見即所得”也是一個(gè)非常友好的特點(diǎn)。Windows可以把文本文件等看作一串圖形,而在屏幕上畫出的圖形,在打印的時(shí)候也將以同樣形式出現(xiàn)
7、。 Windows操作系統(tǒng)還提供了多任務(wù)功能。多任務(wù)對于用戶是很重要的,因?yàn)樗试S同時(shí)運(yùn)行幾個(gè)應(yīng)用程序,用戶無需退出一個(gè)應(yīng)用程序再進(jìn)入另一個(gè)應(yīng)用程序,而只需簡單地在各個(gè)應(yīng)用程序之間來回切換就可以了。 Windows對于程序員的優(yōu)越性: Windows中許多對用戶的優(yōu)越性也是對程序員的優(yōu)越性,例如一致的用戶界面。因?yàn)槿绻麘?yīng)用程序的界面對每一個(gè)應(yīng)用程序都是相同的,程序員就可以建立一套基本的界面設(shè)
8、計(jì)工具,用它們來生成應(yīng)用程序的用戶界面(這就是可視化編程的思想):而在解決了程序的用戶界面后,程序員可以花更多的時(shí)間去進(jìn)行應(yīng)用程序的功能設(shè)計(jì)。Windows圖形用戶界面的基本元素也是其具有的另一個(gè)優(yōu)點(diǎn)。程序員可以很容易地設(shè)計(jì)出代表諸如文件和目錄物理結(jié)構(gòu)的圖形表示,并能提供這些元素所具有的特性。,第一章 Windows程序設(shè)計(jì)概述(三),Windows對存儲(chǔ)器的管理也是一個(gè)很明顯的優(yōu)點(diǎn)。這個(gè)優(yōu)點(diǎn)可以使應(yīng)用程序能夠存取更多的內(nèi)存資源,同時(shí)
9、能保持系統(tǒng)設(shè)計(jì)中的靈活性。 Windows提供了開發(fā)獨(dú)立于設(shè)備的圖形的能力。一個(gè)設(shè)計(jì)良好的Windows應(yīng)用程序并不對硬件直接存取圖形,這意味著程序并不依賴于某一確定的系統(tǒng)配置,所以,每一個(gè)程序員不需要為所有可能的顯示器、適配卡和打印機(jī)開發(fā)設(shè)備驅(qū)動(dòng)程序。,第一節(jié) Windows發(fā)展歷程,Microsoft Windows是一個(gè)應(yīng)用于微型計(jì)算機(jī)上的基于圖形用戶界面的操作系統(tǒng)。它為應(yīng)用程序提供了一個(gè)由一致的圖形用戶界面構(gòu)成
10、的多任務(wù)環(huán)境。由于應(yīng)用程序之間的界面是一致的,因而對于用戶來說,Windows應(yīng)用程序相對于基于DOS的應(yīng)用程序更容易學(xué)習(xí)和使用。多任務(wù)Windows系統(tǒng)的好處在于允許同時(shí)運(yùn)行幾個(gè)應(yīng)用程序,特別是運(yùn)行幾個(gè)專為Windows環(huán)境而創(chuàng)建的應(yīng)用程序。當(dāng)然,Windows也提供了運(yùn)行非Windows的MS-DOS應(yīng)用程序的機(jī)制。 Microsoft公司早在1983年就開始了Windows操作系統(tǒng)第一版的研制工作,并于1
11、985年發(fā)布了Windows的1.l版。該版本的Windows支持自動(dòng)的拼接式應(yīng)用程序窗口及彈出式窗口。Windows經(jīng)過不斷升級(jí)換代,現(xiàn)在最新版本是 Windows 2000,它基于網(wǎng)絡(luò)環(huán)境。本課件將結(jié)合 Windows 98系統(tǒng)平臺(tái),全面介紹 Windows API程序設(shè)計(jì)。,第二節(jié) Windows 程序工作原理,Windows 程序設(shè)計(jì)是一種完全不同于傳統(tǒng)的DOS方式的程序設(shè)計(jì)方法,它是一種事件驅(qū)動(dòng)方式的程序設(shè)計(jì)模式。在程序提供
12、給用戶的界面中有許多可操作的可視對象。用戶從所有可能的操作中任意選擇,被選擇的操作會(huì)產(chǎn)生某些特定的事件,這些事件發(fā)生后的結(jié)果是向程序中的某些對象發(fā)出消息,然后這些對象調(diào)用相應(yīng)的消息處理函數(shù)來完成特定的操作。Windows應(yīng)用程序最大的特點(diǎn)就是程序沒有固定的流程,而只是針對某個(gè)事件的處理有特定的子流程,Windows應(yīng)用程序就是由許多這樣的子流程構(gòu)成的。 從上面的討論中可以看出,Windows應(yīng)用程序在本質(zhì)上是面向?qū)ο蟮?。?/p>
13、序提供給用戶界面的可視對象在程序的內(nèi)部一般也是一個(gè)對象,用戶對可視對象的操作通過事件驅(qū)動(dòng)模式觸發(fā)相應(yīng)對象的可用方法。程序的運(yùn)行過程就是用戶的外部操作不斷產(chǎn)生事件,這些事件又被相應(yīng)的對象的過程處理。 一般的程序流程如圖l-l所示。,一、理解Windows消息機(jī)制 Wndows系統(tǒng)是通過消息驅(qū)動(dòng)的。消息的組成如下: 消息名稱(UINT)和兩個(gè)參數(shù)(WPARAM,LPARAM)。,當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí),系統(tǒng)
14、都會(huì)發(fā)送消息到某一個(gè)窗口。例如當(dāng)選中某菜單命令之后會(huì)發(fā)送WM_COMMAND消息,WPARAM的高字(HIWORD(wParam)中是命令的ID號(hào),對菜單來講就是菜單ID。當(dāng)然用戶也可以定義自己的消息名稱,并利用自定義消息來發(fā)送通知和傳送數(shù)據(jù)。 一個(gè)消息必須由一個(gè)窗口接收。在窗口的過程( WNDPROC)中可以對消息進(jìn)行分析,對自己感興趣的消息進(jìn)行處理。例如你希望對菜單選擇進(jìn)行處理,那么你可以定義對WM_ COMMAND
15、消息進(jìn)行處理的代碼;如果希望在窗口中進(jìn)行圖形輸出,就必須對WM_PAINT消息進(jìn)行處理。 Microsoft為窗口編寫了默認(rèn)的窗口過程,該過程負(fù)責(zé)處理那些你不處理的消息。正因?yàn)橛辛诉@個(gè)默認(rèn)窗口過程,我們才可以利用Windows的窗口進(jìn)行開發(fā)而不必過多關(guān)注窗口各種消息的處理。例如窗口在被拖動(dòng)時(shí)會(huì)發(fā)送很多消息,而我們都可以不予理睬,讓系統(tǒng)自己去處理。 說到消息就不能不說窗口句柄。系統(tǒng)通過窗口句柄在整個(gè)系統(tǒng)中唯一標(biāo)識(shí)一
16、個(gè)窗口,發(fā)送一個(gè)消息時(shí)必須指定一個(gè)窗口句柄,表明該消息由那個(gè)窗口接收。每個(gè)窗口都有自己的窗口過程,所以用戶的輸入就會(huì)被正確地處理。,下面有一段偽代碼演示如何在窗口過程中處理消息:LONG WndProc(HWND hwnd , UINT MessageType ,WPARAM , LPARAM) { switch(MessageType) {// 使用SWITCH語句將各種消息分開
17、 case(WM_PAINT): doYourWindow (…); // 在窗口需要重新繪制時(shí)進(jìn)行輸出 break ; case (WM_LBUTTONDOWN): doYourWork(…)// 在鼠標(biāo)左鍵被按下時(shí)進(jìn)行處理 break ; default
18、: callDefaultWndProc(…) ; // 對于其他情況就讓系統(tǒng)自己處理 break; } },系統(tǒng)將維護(hù)一個(gè)或多個(gè)消息隊(duì)列,所有產(chǎn)生的消息都會(huì)被放入或是插入隊(duì)列中。系統(tǒng)會(huì)在隊(duì)列中取出每一條消息,根據(jù)消息的接收句柄將該消息發(fā)送給擁有該窗口的程序的消息循環(huán)。每一個(gè)運(yùn)行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的
19、窗口過程。而在沒有消息時(shí)消息循環(huán)就將控制權(quán)交給系統(tǒng),所以Windows可以同時(shí)進(jìn)行多個(gè)任務(wù)。下面的偽代碼演示了消息循環(huán)的用法: While(1) { id=getMessage(…); if(id==quit) break; translateMessage(…); }當(dāng)該程序沒有消息通知時(shí),getMessage就不會(huì)返回,也就不會(huì)占用系統(tǒng)的CPU時(shí)間。,二
20、、協(xié)同式多任務(wù)與搶先式多任務(wù)系統(tǒng)在16位的操作系統(tǒng)中只有一個(gè)消息隊(duì)列,所以系統(tǒng)必須等待當(dāng)前任務(wù)處理消息后才可以發(fā)送下一消息到相應(yīng)程序,如果一個(gè)程序陷入死循環(huán)或是操作超時(shí),系統(tǒng)就得不到控制權(quán)。這種多任務(wù)系統(tǒng)被稱為協(xié)同式多任務(wù)系統(tǒng)。 Windows 3.x就是這種系統(tǒng)。而32位的系統(tǒng)中每一個(gè)運(yùn)行的程序都會(huì)有一個(gè)消息隊(duì)列,所以系統(tǒng)可以在多個(gè)消息隊(duì)列中轉(zhuǎn)換,而不必等待當(dāng)前程序完成消息處理才可以得到控制權(quán)。這種多任務(wù)系統(tǒng)就是所謂的搶先式多任
21、務(wù)系統(tǒng)。 Wndows 2000系列以及以前的Wndows 95/98/NT都屬于這種系統(tǒng)。,吉林大學(xué)遠(yuǎn)程教育課件,Windows A P I編 程,主講人 : 翟慧杰,學(xué) 時(shí):48,(第二講),第三節(jié) Windows應(yīng)用程序設(shè)計(jì)特點(diǎn),在過去,進(jìn)行Windows程序設(shè)計(jì)是一件痛苦異常的事情,原因是那時(shí)候還沒有現(xiàn)在這些設(shè)計(jì)精美的應(yīng)用程序開發(fā)工具。在今天,即便是一個(gè)對Windows程序內(nèi)部運(yùn)行機(jī)制幾乎一無所知的初學(xué)者
22、,只需要通過不到一天的學(xué)習(xí),也可以使用如 Visual Basic之類的程序開發(fā)工具創(chuàng)建出功能完整的Windows應(yīng)用程序來。從某種角度說,Windows程序不是編出來的,而是由程序員畫出來的。但是要知道,一個(gè)出色的Windows的應(yīng)用程序并不僅在于在屏幕上繪出程序的各個(gè)窗口和在窗口中恰當(dāng)?shù)匕才琶恳粋€(gè)控件。對于具有一定基礎(chǔ)的程序員而言,更重要的內(nèi)容在于知道Windows和Windows應(yīng)用程序的運(yùn)行機(jī)制,以及它們之間以何種方式來進(jìn)行通信
23、。換句話說,我們需要透過Windows漂亮的圖形用戶界面,認(rèn)清在底層所發(fā)生的每一件事情。,Windows應(yīng)用程序是事件驅(qū)動(dòng)(或稱作消息驅(qū)動(dòng))的應(yīng)用程序。而 Windows 是一個(gè)多任務(wù)的操作系統(tǒng),也就是說,在同一時(shí)刻,在Windows中有著多個(gè)應(yīng)用程序的實(shí)例正在運(yùn)行,例如我在打開字處理軟件Notepad鍵人純文本的同時(shí),還打開了Winmap來播放歌曲。在這樣的一個(gè)操作系統(tǒng)中,不可能像過去的DOS那樣,由一個(gè)應(yīng)用程序來享用所有的系統(tǒng)資源,
24、這些資源是由Windows統(tǒng)一管理的。那么,特定的應(yīng)用程序如何獲得用戶輸入的信息呢?事實(shí)上,Windows時(shí)刻監(jiān)視著用戶的一舉一動(dòng),并分析用戶的動(dòng)作與哪一個(gè)應(yīng)用程序相關(guān),然后,將用戶的動(dòng)作以消息的形式發(fā)送給該應(yīng)用程序,應(yīng)用程序時(shí)刻等待著消息的到來,一旦發(fā)現(xiàn)它的消息隊(duì)列中有未處理的消息,就獲取并分析該消息,最后,應(yīng)用程序根據(jù)消息所包含的內(nèi)容采取適當(dāng)?shù)膭?dòng)作來響應(yīng)用戶所作的操作。Windows為每一個(gè)應(yīng)用程序,確切地說是每一個(gè)線程維護(hù)相應(yīng)的
25、消息隊(duì)列。應(yīng)用程序的任務(wù)就是不停地從它的消息隊(duì)列中獲取消息,分析和處理消息,直到接到一條叫作WM_QUIT消息為止,這個(gè)過程通常是由一種叫作消息循環(huán)的程序結(jié)構(gòu)來實(shí)現(xiàn)的。,Windows能向應(yīng)用程序發(fā)送的消息多達(dá)數(shù)百種,但是,對于一般的應(yīng)用程序來說,只是其中的一部分有意義,如果你的應(yīng)用程序只使用鼠標(biāo),那么如 WM_KEYUP、WM_KEYDOWN和WM_CHAR等消息就沒有任何意義,也就是說,應(yīng)用程序中事實(shí)上不需要處理這些事件,對于這些事
26、件,只需要交給Windows作默認(rèn)的處理即可。因此,在應(yīng)用程序中,我們需要處理的事件只是所有事件中的一小部分。 事件驅(qū)動(dòng)圍繞著消息的產(chǎn)生與處理展開,一條消息是關(guān)于發(fā)生的事件的消息。事件驅(qū)動(dòng)是靠消息循環(huán)機(jī)制來實(shí)現(xiàn)的。,Windows 應(yīng)用程序的消息來源有以下 4種: (l)輸入消息:包括鍵盤和鼠標(biāo)的輸入。這一類消息首先放在系統(tǒng)消息隊(duì)列中,然后由Windows將它們送入應(yīng)用程序消息隊(duì)列中,由應(yīng)用程序來處理消息
27、。 (2)控制消息:用來與Windows的控制對象,如列表框、按鈕、檢查框等進(jìn)行雙向通信。當(dāng)用戶在列表框中改動(dòng)當(dāng)前選擇或改變了檢查框的狀態(tài)時(shí)發(fā)出此類消息。這類消息一般不經(jīng)過應(yīng)用程序消息隊(duì)列,而是直接發(fā)送到控制對象上去。 (3)系統(tǒng)消息:對程序化的事件或系統(tǒng)時(shí)鐘中斷作出反應(yīng)。一些系統(tǒng)消息,像DDE消息(動(dòng)態(tài)數(shù)據(jù)交換消息)要通過Windows的系統(tǒng)消息隊(duì)列,而有的則不通過系統(tǒng)消息隊(duì)列而直接送入應(yīng)用程序的消息隊(duì)列,如創(chuàng)建窗口消
28、息。 (4)用戶消息:這是程序員自己定義并在應(yīng)用程序中主動(dòng)發(fā)出的,一般由應(yīng)用程序的某一部分內(nèi)部處理。 Windows程序在處理消息時(shí)使用了一種叫作回調(diào)函數(shù)(Callback Function)的特殊函數(shù)。回調(diào)函數(shù)由應(yīng)用程序定義,但是,在應(yīng)用程序中并沒有調(diào)用回調(diào)函數(shù)的代碼,回調(diào)函數(shù)是供操作系統(tǒng)或者其子系統(tǒng)調(diào)用的,這種調(diào)用通常在某一事件發(fā)生,或者在窗口或字體被枚舉時(shí)。典型的回調(diào)函數(shù)有窗口過程、對話框過程和鉤子函數(shù)。,第四節(jié) W
29、indows API和 SDK,一、Windows API 說到 Windows編程,就不能不談到 Windows API(Windows Application Programming Interface,Windows應(yīng)用程序編程接口),它是所有 Windows應(yīng)用程序的根本之所在。簡單地說,API就是一系列的例程,應(yīng)用程序通過調(diào)用這些例程來請求操作系統(tǒng)完成一些低級(jí)服務(wù)。在Windows這樣的圖形用戶界面中,應(yīng)用程序的窗口、
30、圖標(biāo)、菜單和對話框等就是由API來管理和維護(hù)的。在DOS應(yīng)用程序下,可以通過getchar ()等函數(shù)直接等待鍵盤輸入,并直接向屏幕輸出。而在Windows下,由于允許多個(gè)任務(wù)同時(shí)運(yùn)行,應(yīng)用程序的輸入輸出是由Windows來統(tǒng)一管理的。 Windows 操作系統(tǒng)包括 3個(gè)內(nèi)核基本元件: GDI,KERNEL,USER。其中 GDI(圖形設(shè)備接口)負(fù)責(zé)在屏幕上繪制像素、打印硬拷貝輸出、繪制用戶界面(包括窗口、菜單。對話框)等。系統(tǒng)內(nèi)核K
31、ERNEL支持與操作系統(tǒng)密切相關(guān)的功能:如進(jìn)程加載,文本切換、文件I/O,以及內(nèi)存管理、線程管理等。USER為所有的用戶界面對象提供支持,它用于接收和管理所有輸入消息、系統(tǒng)消息并把它們發(fā)給相應(yīng)的窗口的消息隊(duì)列。消息隊(duì)列是一個(gè)系統(tǒng)定義的內(nèi)存塊,用于臨時(shí)存儲(chǔ)消息;或是把消息直接發(fā)給窗口過程。每個(gè)窗口維護(hù)自己的消息隊(duì)列,并從中取出消息,利用窗口函數(shù)進(jìn)行處理。,Windows API具有兩種基本類型: Winl6 API和Win32 API。兩
32、者在很多方面非常相像,但是Win32 API除了幾乎包括了Winl6 API中的所有內(nèi)容以外,還包括很多的其他內(nèi)容。Windows API依靠 3個(gè)主要的核心組件提供 Windows的大部分函數(shù),在Winl6和 Win32中,它們具有不同的名稱,如表l一1所示。 雖然Winl6
33、API組件帶有.EXE的擴(kuò)展名,但是它們事實(shí)上都是動(dòng)態(tài)鏈接庫(.DLL),不能單獨(dú)運(yùn)行。其他一些非核心的Windows API由其他組件所提供的DLL來實(shí)現(xiàn),這些組件包括通用對話框、打印、文件壓縮、版本控制以及多媒體支持等。,二、Windows SDK Windows SDK(Windows Software Development Kit, Windows軟件開發(fā)工具包)和Windows API緊密聯(lián)系,它是一套幫助 C語
34、言程序員創(chuàng)建Windows應(yīng)用程序的工具,在Windows SDK中包括了以下幾個(gè)組成部分: .大量的在線幫助,這些幫助描述了Windows編程所可能用到的函數(shù)、消息、結(jié)構(gòu)、宏及其他資源。 .各種編程工具,如對話框編輯器及圖像編輯器等。 .Windows庫及頭文件。 .使用C語言編寫的示例程序。 該工具包的最新版本就是我們正在使用的 Win32 SDK。在安裝 Visual C++的同時(shí),Win3
35、2 SDK也安裝到你的計(jì)算機(jī)上了。盡管MFC提供了對Win32 API的比較完整的封裝,但是,在某些情況下,我們更傾向于直接調(diào)用 Win32 API,因?yàn)檫@有時(shí)候可以獲得更高的效率,并且有著更大的自由度。而且,使用MFC編寫的新風(fēng)格的Windows應(yīng)用程序的工作方式基本上與使用SDK編寫的程序一樣,它們往往有著很多的共同之處,只是使用MFC更加方便,因?yàn)樗[藏了大量的復(fù)雜性。 面向?qū)ο蟮木幊谭绞绞钱?dāng)前最流行的程序設(shè)計(jì)方法,但是, W
36、in32 API本身卻是基于C語言的過程式編程的,SDK和MFC的最主要的不同之處也就是C與C+十之間的差別,使用MFC進(jìn)行Windows應(yīng)用程序設(shè)計(jì)需要面向?qū)ο蟮木幊趟枷牒头椒ǎ?三、使用 SDK編寫 Windows應(yīng)用程序傳統(tǒng)的DOS程序以main() 函數(shù)作為進(jìn)入程序的初始人口點(diǎn),在Windows應(yīng)用程序中,main函數(shù)被WinMain函數(shù)取而代之,WinMain函數(shù)的原型如下: int WINAPI WinMain(
37、HINSTANCE hInstance, // 當(dāng)前實(shí)例句柄; HINSTANCE hPrevInstance, // 前一實(shí)例句柄; LPSTR lpCmdLine, // 指向命令行參數(shù)的指針; int nCmdshow) // 窗口的顯示狀態(tài)。所謂的句柄是一個(gè)標(biāo)
38、識(shí)對象的變量,或者是一個(gè)對操作系統(tǒng)資源的間接引用。句柄是指向一個(gè)“無類型對象”(Void*)的指針,也就是一個(gè)4字節(jié)長的數(shù)據(jù)。其聲明是這樣的: typedef void *HANDLEWindows是一個(gè)多任務(wù)操作系統(tǒng),它可以同時(shí)運(yùn)行多個(gè)程序或一個(gè)程序的多個(gè)副本。為了對同一程序的多個(gè)副本進(jìn)行管理,Windows引入了實(shí)例句柄。Windows為每個(gè)應(yīng)用程序建立一張表,實(shí)例句柄就好像是這張表的一個(gè)索引。Windows不僅使用句柄來
39、管理實(shí)例,也用它來管理窗口、位圖、字體、元文件、圖標(biāo)等系統(tǒng)資源。一般情況下,我們應(yīng)該在WinMain函數(shù)中完成下面的操作: (l)注冊窗口類。 (2)創(chuàng)建應(yīng)用程序主窗口。 (3)進(jìn)入應(yīng)用程序消息循環(huán)。,第五節(jié) Windows API程序設(shè)計(jì)基礎(chǔ)知識(shí),要在Windows上開發(fā)應(yīng)用程序,就必須對Windows程序設(shè)計(jì)有所了解。 在編程時(shí),變量、函數(shù)的命名是一個(gè)極其重要的問題。好的命名方法使變量易于記
40、憶且程序可讀性大大提高。 Microsoft采用匈牙利命名法來命名 Windows API函數(shù)和變量。匈牙利命名法是由Microsoft的著名開發(fā)人員,Excel的主要設(shè)計(jì)者查爾斯·西蒙尼在他的博士論文中提出來的,由于西蒙尼的國籍是匈牙利,所以這種命名法叫匈牙利命名法。 匈牙利命名法為C標(biāo)識(shí)符的命名定義了一種非常標(biāo)準(zhǔn)化的方式,這種命名方式是以下面兩條規(guī)則為基礎(chǔ)的: .標(biāo)識(shí)符的名字以一個(gè)或者多個(gè)小寫字母開頭,用這
41、些字母來指定數(shù)據(jù)類型。表l-2列出了常用的數(shù)據(jù)類型的標(biāo)準(zhǔn)前綴。 .在標(biāo)識(shí)符內(nèi),前綴以后就是一個(gè)或者多個(gè)第一個(gè)字母大寫的單詞,這些單詞清楚地指出了源代碼內(nèi)那個(gè)對象的用途。比如,m_szStudentName表示一個(gè)學(xué)生名字的類成員變量,數(shù)據(jù)類型是字符串型,,第六節(jié) Windows API程序的開發(fā)步驟,開發(fā)基于 Windows API的應(yīng)用程序一般可以參考下面的步驟。啟動(dòng)Visual C++編譯器后,選擇 File菜單下的 New
42、菜單項(xiàng),在列表框中選擇 Win32 Application項(xiàng)。然后在 Project name文本框中輸入新建的項(xiàng)目名,再在Location文本框中輸入新建項(xiàng)目所在的路徑。 可用如下三種方式的任意一種創(chuàng)建 Windows API應(yīng)用程序。 . An empty project一個(gè)空項(xiàng)目; . A simpla Win32 application 一個(gè)簡單的Win32應(yīng)用程序 . A typi
43、cal" Hello World”application一個(gè)典型的“Hello Word”應(yīng)用程序。 如果選擇A simple Win32 application項(xiàng), Visual C++ 編譯器將自動(dòng)為用戶生成項(xiàng)目的框架文件。 對初學(xué) Windows API程序設(shè)計(jì)的程序員來說,“Hello World!”應(yīng)用程序是一個(gè)很好的范例。當(dāng)選擇了 A typical "Hello World!”app
44、lication這一項(xiàng)后,Visual C++編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)完整的應(yīng)用程序,這個(gè)程序?qū)⒃趶棾龅拇翱谥酗@示 Hello World!。 如果希望直接鍵人源程序,可以選擇 An empty project這一項(xiàng)。 項(xiàng)目框架建立起來后,需要向其中加入相關(guān)的文件,這些文件可能是已經(jīng)存在的,也可能是需要重新編輯建立的。 要向項(xiàng)目中加入文件,可以單擊Visual C++編譯器中Project菜單下的Add To Proj
45、ect級(jí)聯(lián)菜單下的Files菜單項(xiàng), 選擇需要插入到項(xiàng)目中的文件,然后單擊OK按鈕,相應(yīng)的文件就會(huì)被插入到項(xiàng)目中。 單擊 Visual C++編譯器中File菜單下的 New菜單項(xiàng),列表框中列出了所有可以新建的文件類型,這些文件中用得最為頻繁的是C++ Source File。首先選中列表框中的C++ Source File項(xiàng),然后在File文本框中鍵入文件名,再單擊OK按鈕。這樣就可以在Visual C++編譯器中鍵人相應(yīng)的源文件了
46、。其他類型的文件可以參照 C++ Source File的建立步驟。,第二章 WINDOWS應(yīng)用程序框架,創(chuàng)建窗口只需調(diào)用CreateWindow 函數(shù)即可,但實(shí)際上并不這么簡單。 但實(shí)際上并非真得這么簡單。雖然創(chuàng)建窗口的函數(shù)確實(shí)被命名為CreateWindow, 但您將發(fā)現(xiàn) CreateWindow的第一個(gè)參數(shù)就是所謂的“窗口類名稱”,并且該窗口類連接所謂的“窗口過程”。在我們調(diào)用CreateWindow之前,有一點(diǎn)背景知識(shí)會(huì)對您大有
47、幫助。,第一節(jié) WINDOWS應(yīng)用程序的基本結(jié)構(gòu),進(jìn)行Windows程序設(shè)計(jì),實(shí)際上是在進(jìn)行一種面向?qū)ο蟮某绦蛟O(shè)計(jì)(OOP)。這一點(diǎn)在Windows中使用得最多的對象身上表現(xiàn)最為明顯。 這種對象正是Windows之所以命名 為“Windows”的原因,它具有人格化的特征,這就是那個(gè)叫做“窗口”的對象。,一、總體結(jié)構(gòu),桌面上最明顯的窗口就是應(yīng)用程序窗口。這些窗口含有顯示程序名稱的標(biāo)題欄、菜單,甚至可能還有工具
48、欄和滾動(dòng)條。另一類窗口是對話框,它可以有標(biāo)題欄也可以沒有標(biāo)題欄。 裝飾對話框表面的還有各式各樣的按鈕、單選鈕、復(fù)選框、列表框、滾動(dòng)條和文本輸入?yún)^(qū)域。其中每一個(gè)小的可視對象都是一個(gè)窗口。更確切地說,這些都稱為“子窗口”或“控件窗口”或“子窗口控件”。,作為對象,用戶會(huì)在屏幕上看到這些窗口,并通過鍵盤和鼠標(biāo)直接與它們進(jìn)行交互操作。更有趣的是,程序員的觀點(diǎn)與用戶的觀點(diǎn)極其類似。窗口以“消息”的形式接收窗口的輸入,窗口也用
49、消息與其他窗口通訊。對消息的理解將是學(xué)習(xí)如何編寫Windows程序必須逾越的障礙之一。 這有一個(gè)windows的消息示例:我們知道,大多數(shù)的windows程序都有大小合適的應(yīng)用程序窗口。也就是說,您能夠通過鼠標(biāo)拖動(dòng)窗口的邊框來改變窗口的大小。通常,程序?qū)⑼ㄟ^改變窗口中的內(nèi)容來響應(yīng)這種大小的變化。是Windows本身而不是應(yīng)用程序正在處理與用戶重新調(diào)整窗口大小相關(guān)的全部代碼。由于應(yīng)用程序能改變其顯示的格式,所以它也“知道”窗口
50、大小改變了。,應(yīng)用程序是如何知道用戶改變了窗口的大小的呢?由于程序員習(xí)慣了常規(guī)的字符模式程序,操作系統(tǒng)沒有設(shè)置將此類消息通知給用戶的機(jī)制。問題的關(guān)鍵在于理解Windows所使用的體系結(jié)構(gòu)。當(dāng)用戶改變窗口的大小時(shí),Windows給程序發(fā)送一條消息指出新窗口的大小。然后程序就可以調(diào)整窗口中的內(nèi)容,以反映大小的變化。 “Windows給程序發(fā)送消息。”我們希望讀者不要對這句話視而不見。它到底表達(dá)了什么意思呢?我們在這里討論的是程序
51、代碼,而不是一個(gè)電子郵件系統(tǒng)。操作系統(tǒng)怎么給程序發(fā)送消息呢?其實(shí),所謂“Windows給程序發(fā)送消息”,是指Windows調(diào)用程序中的一個(gè)函數(shù),該函數(shù)的參數(shù)描述了這個(gè)特定消息。這種位于Windows程序中的函數(shù)被稱為“窗口過程”。 無疑,讀者對程序調(diào)用操作系統(tǒng)的思路是很熟悉的。例如,程序在打開磁盤文件時(shí)就要使用有關(guān)的系統(tǒng)調(diào)用。讀者所不習(xí)慣的,可能是操作系統(tǒng)調(diào)用程序,而這正是Windows面向?qū)ο篌w系結(jié)構(gòu)的基礎(chǔ)。,程序創(chuàng)建的每一個(gè)
52、窗口都有相關(guān)的窗口過程。這個(gè)窗口過程是一個(gè)函數(shù),既可以在程序中,也可以在動(dòng)態(tài)鏈接庫中。Windows通過調(diào)用窗口過程來給窗口發(fā)送消息。窗口過程根據(jù)此消息進(jìn)行處理,然后將控制返回給Windows。 更確切地說,窗口通常是在“窗口類”的基礎(chǔ)上創(chuàng)建的。窗口類標(biāo)識(shí)了處理窗口消息的窗口過程。使用窗口類使多個(gè)窗口能夠基于同 一個(gè)窗口類,并且使用同一個(gè)窗口過程。例如,所有Windows程序中的所有按鈕均基于同一個(gè)窗口類。這個(gè)窗口類與
53、一個(gè)位于Windows動(dòng)態(tài)鏈接庫(處理所有的按鈕窗口消息)的窗口過程相聯(lián)系。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對象是代碼與數(shù)據(jù)的組合。窗口是一種對象,其代碼是窗口過程。數(shù)據(jù)是窗口過程保存的信息,以及Windows為每個(gè)窗口系統(tǒng)中那個(gè)窗口類保存的信息。窗口過程處理給窗口發(fā)送的消息。這些消息經(jīng)常是告知窗口,用戶正使用鍵盤或鼠標(biāo)進(jìn)行輸入。這正是按鈕窗口知道它被“按下”的奧妙所在。在窗口大小改變或窗口表面需要重畫時(shí),由其他消息通知窗口。,Windows程
54、序開始執(zhí)行后,Windows為該程序創(chuàng)建一個(gè)“消息隊(duì)列”。這個(gè)消息隊(duì)列用來存放該程序可能創(chuàng)建的各種不同窗口的消息。程序中有一小段代碼,叫做“消息循環(huán)”,用來從隊(duì)列中取出消息,并且將它們發(fā)送給相應(yīng)的窗口過程。有些消息直接發(fā)送給窗口過程,不用放人消息隊(duì)列中。如果您對這段有關(guān)Windows體系結(jié)構(gòu)的過于簡略的描述將信將疑,就讓我們?nèi)タ纯丛趯?shí)際的程序中,窗口、窗口類、窗口過程、消息隊(duì)列、消息循環(huán)和窗口消息是如何相互配合的。這或許對您會(huì)
55、有些幫助。創(chuàng)建一個(gè)窗口首先需要注冊一個(gè)窗口類,那需要一個(gè)窗口過程來處理窗口消息。這包 括一段幾乎出現(xiàn)在每一個(gè)Window程序中的固定代碼。程序2.1所示的HELLOWIN程序就是一個(gè)包括這段固定代碼的簡單程序。,吉林大學(xué)遠(yuǎn)程教育課件,Windows A P I編 程,(第三講),主講人 : 翟慧杰,學(xué) 時(shí):48,第三講),二、程序2.1,#include LRESULT CALLBACK WndProc (HW
56、ND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT ("HelloWi
57、n") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ;
58、 wndclass.cbWndExtra = 0 ;,wndclass.hInstance = hInstance ; wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION) ; wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBac
59、kground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (N
60、ULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; },hwnd = CreateWindow (szAppName,
61、 // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT,
62、 // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT
63、, // initial y size NULL, // parent window handle NULL, // window menu handle hInstan
64、ce, // program instance handle NULL) ; // creation parameters,ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg
65、, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ;},LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
66、 WPARAM wParam, LPARAM lParam){ HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_CREATE: PlaySound (TEXT ("hellowin.wav"), NULL,
67、 SND_FILENAME | SND_ASYNC) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, Windows 98!"
68、), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } retur
69、n DefWindowProc (hwnd, message, wParam, lParam) ;},三、總體考慮,實(shí)際上,每一個(gè)Windows程序代碼中都包括HELLOWIN.C程序的大部分。沒人能真正記住編寫此代碼的全部語法;通常,Windows程序員在開始一個(gè)新程序時(shí)總是復(fù)制一個(gè) 現(xiàn)有的程序,然后再做相應(yīng)的修改。上面提到,HELLOWIN將在其窗口的中央顯示文本串。那不完全正確。文本實(shí)際顯示在程序客戶區(qū)的中央,它在圖
70、中是標(biāo)題欄和邊界范圍內(nèi)的大片白色區(qū)域。這種特性對我們很重要;客戶區(qū)就是程序自由繪圖并且向用戶交付可觀輸出的窗口區(qū)域。如果您認(rèn)真思考一下,將會(huì)發(fā)現(xiàn)雖然只有80行代碼,這個(gè)窗口卻令人驚訝地具有許多功能。您可以用鼠標(biāo)按住標(biāo)題欄,在屏幕上移動(dòng)窗口;可以按住邊框,改變窗口的大小。在窗口大小改變時(shí),程序自動(dòng)地將“hello,windows 98!”文本串重新定位在客戶區(qū)域的中央。您可以按最大化按鈕,放大HELLOWIN以充滿整個(gè)屏幕;也可以按最小化
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)期吉林大學(xué)遠(yuǎn)程教育教師信息表
- 吉林大學(xué)遠(yuǎn)程教育學(xué)院護(hù)理專業(yè)
- 遠(yuǎn)程教育課件資源的共享研究.pdf
- 吉林大學(xué)遠(yuǎn)程教育2005~2006學(xué)年春季第六學(xué)期教學(xué)執(zhí)行計(jì)劃
- 談公路工程路基處理方法吉林大學(xué)遠(yuǎn)程教育本科畢業(yè)論文
- 吉林大學(xué)遠(yuǎn)程教育本科生畢業(yè)論文設(shè)計(jì)規(guī)范化要求
- 2018現(xiàn)代遠(yuǎn)程教育課程表
- 吉林大學(xué)網(wǎng)絡(luò)教育
- 吉林大學(xué)
- 東南大學(xué)遠(yuǎn)程教育
- 吉林大學(xué)儀器分析課件部分
- 吉林大學(xué)
- 吉林大學(xué)
- 中英遠(yuǎn)程教育課程設(shè)置的比較研究.pdf
- 中國吉林大學(xué)
- [教育]浙江大學(xué)遠(yuǎn)程教育項(xiàng)目介紹
- 奧鵬遠(yuǎn)程教育中心學(xué)歷教育課程考試
- 奧鵬遠(yuǎn)程教育中心學(xué)歷教育課程考試
- 大學(xué)畢業(yè)論文之網(wǎng)絡(luò)遠(yuǎn)程教育-遠(yuǎn)程教育研究及其理論范式
- 吉林大學(xué)加密課件播放器使用
評(píng)論
0/150
提交評(píng)論