

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