




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、WindowsWindows程序的程序的內(nèi)部運(yùn)行原理內(nèi)部運(yùn)行原理Windows程序設(shè)計(jì)是完全不同于程序設(shè)計(jì)是完全不同于Dos環(huán)境下的程序環(huán)境下的程序設(shè)計(jì),是一種事件驅(qū)動(dòng)的程序設(shè)計(jì)方法。主要是基設(shè)計(jì),是一種事件驅(qū)動(dòng)的程序設(shè)計(jì)方法。主要是基于于消息消息的。當(dāng)用戶需要完成某種功能時(shí),會(huì)調(diào)用的。當(dāng)用戶需要完成某種功能時(shí),會(huì)調(diào)用OS的某種支持,的某種支持,OS將用戶的需要包裝成某種消息,并將用戶的需要包裝成某種消息,并投遞到消息隊(duì)列當(dāng)中。然后利用應(yīng)用程序從消息隊(duì)投遞到消息隊(duì)列當(dāng)中。然后利用應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。列中取走消息并進(jìn)行響應(yīng)。操作系統(tǒng)操作系統(tǒng)輸入輸出設(shè)備輸入輸出設(shè)備應(yīng)用程序應(yīng)用
2、程序消息隊(duì)列消息隊(duì)列操作系統(tǒng)能操作系統(tǒng)能操縱輸入輸操縱輸入輸出設(shè)備,以出設(shè)備,以執(zhí)行特定的執(zhí)行特定的功能功能操作系統(tǒng)能操作系統(tǒng)能感知輸入輸感知輸入輸出設(shè)備的狀出設(shè)備的狀態(tài)變化態(tài)變化 應(yīng)用程序可應(yīng)用程序可以通知操作以通知操作系統(tǒng)執(zhí)行某系統(tǒng)執(zhí)行某個(gè)具體的動(dòng)個(gè)具體的動(dòng)作作 操作系統(tǒng)能操作系統(tǒng)能夠?qū)⑤斎朐O(shè)夠?qū)⑤斎朐O(shè)備的變化上備的變化上傳給應(yīng)用程傳給應(yīng)用程序序 在應(yīng)用程序中要完成某個(gè)功能,都是以函數(shù)調(diào)用的形式實(shí)現(xiàn)的,在應(yīng)用程序中要完成某個(gè)功能,都是以函數(shù)調(diào)用的形式實(shí)現(xiàn)的,同樣,應(yīng)用程序也是以函數(shù)調(diào)用的方式來通知操作系統(tǒng)執(zhí)行相同樣,應(yīng)用程序也是以函數(shù)調(diào)用的方式來通知操作系統(tǒng)執(zhí)行相應(yīng)的功能的。操作系統(tǒng)所能完
3、成的每一個(gè)特殊功能通常都有一應(yīng)的功能的。操作系統(tǒng)所能完成的每一個(gè)特殊功能通常都有一個(gè)函數(shù)與其對應(yīng)。也就是說,操作系統(tǒng)把它能完成的功能以函個(gè)函數(shù)與其對應(yīng)。也就是說,操作系統(tǒng)把它能完成的功能以函數(shù)的形式提供給應(yīng)用程序使用,應(yīng)用程序?qū)@些函數(shù)的調(diào)用就數(shù)的形式提供給應(yīng)用程序使用,應(yīng)用程序?qū)@些函數(shù)的調(diào)用就叫做系統(tǒng)調(diào)用。這些函數(shù)的集合就是叫做系統(tǒng)調(diào)用。這些函數(shù)的集合就是windows操作系統(tǒng)提供給操作系統(tǒng)提供給應(yīng)用程序的編程接口,即應(yīng)用程序的編程接口,即API。如。如CreateWindow就是一個(gè)就是一個(gè)API函數(shù),應(yīng)用程序中調(diào)用這個(gè)函數(shù),操作系統(tǒng)就會(huì)按照該函數(shù)提函數(shù),應(yīng)用程序中調(diào)用這個(gè)函數(shù),操作系統(tǒng)
4、就會(huì)按照該函數(shù)提供的參數(shù)信息產(chǎn)生一個(gè)相應(yīng)的窗口。供的參數(shù)信息產(chǎn)生一個(gè)相應(yīng)的窗口。 應(yīng)用程序如何通知操作系統(tǒng)應(yīng)用程序如何通知操作系統(tǒng)執(zhí)行某個(gè)功能執(zhí)行某個(gè)功能比如用戶在某個(gè)程序活動(dòng)時(shí)按下一個(gè)鍵,操作系統(tǒng)馬上能夠感比如用戶在某個(gè)程序活動(dòng)時(shí)按下一個(gè)鍵,操作系統(tǒng)馬上能夠感知到這一事件,并且能知道用戶按下的是哪個(gè)鍵,操作系統(tǒng)并知到這一事件,并且能知道用戶按下的是哪個(gè)鍵,操作系統(tǒng)并不決定對這個(gè)事件如何做出反應(yīng),而是將這一事件轉(zhuǎn)交給應(yīng)用不決定對這個(gè)事件如何做出反應(yīng),而是將這一事件轉(zhuǎn)交給應(yīng)用程序,由應(yīng)用程序決定如何對這一事件做出反應(yīng)。程序,由應(yīng)用程序決定如何對這一事件做出反應(yīng)。好比有只蚊子叮了我們一口,我們的神
5、經(jīng)末梢(相當(dāng)于操作系好比有只蚊子叮了我們一口,我們的神經(jīng)末梢(相當(dāng)于操作系統(tǒng))馬上感知到這一事件,并傳遞給我們的大腦(相當(dāng)于應(yīng)用統(tǒng))馬上感知到這一事件,并傳遞給我們的大腦(相當(dāng)于應(yīng)用程序)。我們的大腦最終決定如何對這一事件做出反應(yīng),如將程序)。我們的大腦最終決定如何對這一事件做出反應(yīng),如將蚊子趕走,或是將蚊子拍死。對事件做出反應(yīng)的過程就是消息蚊子趕走,或是將蚊子拍死。對事件做出反應(yīng)的過程就是消息響應(yīng)。響應(yīng)。操作系統(tǒng)能夠?qū)⑤斎朐O(shè)備的變化操作系統(tǒng)能夠?qū)⑤斎朐O(shè)備的變化上傳給應(yīng)用程序上傳給應(yīng)用程序操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序的呢?操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序的呢?這是通過消
6、息機(jī)制(這是通過消息機(jī)制(Message)來實(shí)現(xiàn)的。操作系統(tǒng)將每個(gè)事)來實(shí)現(xiàn)的。操作系統(tǒng)將每個(gè)事件都包裝成一個(gè)稱為消息的結(jié)構(gòu)體件都包裝成一個(gè)稱為消息的結(jié)構(gòu)體MSG來傳遞給應(yīng)用程序。來傳遞給應(yīng)用程序。typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG; 關(guān)于消息和消息隊(duì)列關(guān)于消息和消息隊(duì)列窗口句柄消息的名字消息的附加參數(shù)窗口是屏幕上的一個(gè)矩形區(qū)域,應(yīng)用程序窗口是屏幕上的一個(gè)矩形區(qū)域,應(yīng)用程序在該區(qū)域中顯示數(shù)據(jù)并等待鼠標(biāo)點(diǎn)擊。在該區(qū)域中顯示數(shù)據(jù)并
7、等待鼠標(biāo)點(diǎn)擊。WindowsWindows應(yīng)用程序的用戶界面可以包含許多應(yīng)用程序的用戶界面可以包含許多窗口,當(dāng)然要對這些窗口進(jìn)行標(biāo)識。窗口,當(dāng)然要對這些窗口進(jìn)行標(biāo)識。窗窗 口口操作系統(tǒng)要管理和操作這些資源,都是通過句柄來找到對應(yīng)操作系統(tǒng)要管理和操作這些資源,都是通過句柄來找到對應(yīng)的資源。按資源的類型,又可將句柄細(xì)分成的資源。按資源的類型,又可將句柄細(xì)分成圖標(biāo)句柄(圖標(biāo)句柄(HICON)、光標(biāo)句柄()、光標(biāo)句柄(HCURSOR),),窗口句柄(窗口句柄(HWND),應(yīng)用程序?qū)嵗浔ǎ?,?yīng)用程序?qū)嵗浔℉INSTANCE)等各種類型的句柄。等各種類型的句柄。操作系統(tǒng)給每一個(gè)窗口指定的一個(gè)唯一的
8、標(biāo)識號即窗口句柄。操作系統(tǒng)給每一個(gè)窗口指定的一個(gè)唯一的標(biāo)識號即窗口句柄。句柄就是資源的標(biāo)識,就象指針一樣,我們要索引這樣一個(gè)句柄就是資源的標(biāo)識,就象指針一樣,我們要索引這樣一個(gè)資源,就需要通過句柄去索引它。資源,就需要通過句柄去索引它。句柄:句柄: 資源的標(biāo)識資源的標(biāo)識int x,y; x=30,y=40;/x和和y既可以既可以用來表示坐標(biāo)點(diǎn),也可以用來表示寬度和用來表示坐標(biāo)點(diǎn),也可以用來表示寬度和高度,還可以用來表示身高和體重。高度,還可以用來表示身高和體重。typedef int WIDTH;typedef int HEIGHT;WIDTH x;HEIGHT y;/好處:我們從變量的類型就
9、可以知道好處:我們從變量的類型就可以知道x和和y是用來表示是用來表示寬度和高度。寬度和高度。從變量的類型區(qū)分變量的用途從變量的類型區(qū)分變量的用途操作系統(tǒng)會(huì)為每個(gè)應(yīng)用程序建立一個(gè)消息隊(duì)列。這個(gè)隊(duì)列是個(gè)操作系統(tǒng)會(huì)為每個(gè)應(yīng)用程序建立一個(gè)消息隊(duì)列。這個(gè)隊(duì)列是個(gè)先進(jìn)先出的緩沖區(qū)。消息隊(duì)列中的每個(gè)元素都是一條消息。操先進(jìn)先出的緩沖區(qū)。消息隊(duì)列中的每個(gè)元素都是一條消息。操作系統(tǒng)將生成的消息放在消息隊(duì)列里。第一條消息放入第一格,作系統(tǒng)將生成的消息放在消息隊(duì)列里。第一條消息放入第一格,第二條消息放入第二格,依次類推。應(yīng)用程序總是取走消息隊(duì)第二條消息放入第二格,依次類推。應(yīng)用程序總是取走消息隊(duì)列中的第一條消息。第
10、一條消息取走后,第二條消息往前移,列中的第一條消息。第一條消息取走后,第二條消息往前移,成為第一條,剩余的消息依次前移。應(yīng)用程序取得消息后,便成為第一條,剩余的消息依次前移。應(yīng)用程序取得消息后,便能知道用戶的操作以及應(yīng)用程序的狀態(tài)的變化。能知道用戶的操作以及應(yīng)用程序的狀態(tài)的變化。當(dāng)收到消息的時(shí)候,會(huì)編寫針對這個(gè)消息的處理代碼,這個(gè)過當(dāng)收到消息的時(shí)候,會(huì)編寫針對這個(gè)消息的處理代碼,這個(gè)過程就叫消息響應(yīng)。消息響應(yīng)是通過程序?qū)崿F(xiàn)的,程就叫消息響應(yīng)。消息響應(yīng)是通過程序?qū)崿F(xiàn)的,這就是這就是WindowsWindows應(yīng)用程序的主要代碼區(qū)。應(yīng)用程序的主要代碼區(qū)。消息隊(duì)列消息隊(duì)列消息隊(duì)列消息隊(duì)列PostMe
11、ssageSendMessage在消息響應(yīng)過程中,我們可能要調(diào)用操作系統(tǒng)提供的其他在消息響應(yīng)過程中,我們可能要調(diào)用操作系統(tǒng)提供的其他APIAPI函函數(shù)以便完成特定的功能。例如收到窗口關(guān)閉的消息,我們就可數(shù)以便完成特定的功能。例如收到窗口關(guān)閉的消息,我們就可以調(diào)用一個(gè)銷毀窗口的以調(diào)用一個(gè)銷毀窗口的APIAPI函數(shù)函數(shù)DestroyWindowsDestroyWindows去關(guān)閉該窗口,去關(guān)閉該窗口,或者彈出一個(gè)消息框提示用戶是否真的要關(guān)閉該窗口?;蛘邚棾鲆粋€(gè)消息框提示用戶是否真的要關(guān)閉該窗口。消息隊(duì)列消息隊(duì)列Windows程序的入口函數(shù)程序的入口函數(shù)int APIENTRY _tWinMain
12、( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);WinMain函數(shù)函數(shù)實(shí)例句柄:當(dāng)運(yùn)行一個(gè)程序的時(shí)候,這個(gè)運(yùn)行的程序就叫實(shí)例。先前應(yīng)用程序?qū)嵗浔钚袇?shù)顯示的狀態(tài)(1)設(shè)計(jì)一個(gè)窗口類)設(shè)計(jì)一個(gè)窗口類(2)注冊窗口類)注冊窗口類(3)創(chuàng)建窗口)創(chuàng)建窗口(4)顯示及更新窗口)顯示及更新窗口窗口的創(chuàng)建窗口的創(chuàng)建設(shè)計(jì)窗口類設(shè)計(jì)窗口類窗口類的類型Typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc
13、; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; HICON hIconSm; WNDCLASSEXW#ifdef UNICODEtypedef WNDCLASSEXW WNDCLASSEX;在我們的程序中經(jīng)常要用到一類變量,這個(gè)變量里的在我們的程序中經(jīng)常要用到一類變量,這個(gè)變量里的每一位每一位(bit)都對應(yīng)某一特性。當(dāng)該變量的某位為都對應(yīng)某
14、一特性。當(dāng)該變量的某位為1時(shí),時(shí),表示有該位對應(yīng)的哪種特性,當(dāng)該位為表示有該位對應(yīng)的哪種特性,當(dāng)該位為0時(shí),即沒有該時(shí),即沒有該位所對應(yīng)的特性。當(dāng)變量中的某幾位同時(shí)為位所對應(yīng)的特性。當(dāng)變量中的某幾位同時(shí)為1時(shí),就表時(shí),就表示同時(shí)具有幾種特性的組合。一個(gè)變量中的哪一位代示同時(shí)具有幾種特性的組合。一個(gè)變量中的哪一位代表哪種意義,不容易記憶,所以根據(jù)特征的英文拼寫表哪種意義,不容易記憶,所以根據(jù)特征的英文拼寫的大寫去定義一些宏,該宏所對應(yīng)的數(shù)值中僅有與該的大寫去定義一些宏,該宏所對應(yīng)的數(shù)值中僅有與該特征相對應(yīng)的那一位為特征相對應(yīng)的那一位為1,其余的位都為,其余的位都為0。CS_VREDRAW=0X0
15、001, CS_HREDRAW=0X0002, CS_DBLCKS=0X0008, CS_NOCLOSE=0X0200。它。它們的共同點(diǎn)就是只有一位為們的共同點(diǎn)就是只有一位為1,其余位都為,其余位都為0.窗口類的類型窗口類的類型如果希望某一變量的數(shù)值既有如果希望某一變量的數(shù)值既有CS_VREDRAW特性,特性,又有又有CS_HREDRAW特性,只需使用二進(jìn)制特性,只需使用二進(jìn)制OR操作操作符符將它們進(jìn)行或運(yùn)算相組合。將它們進(jìn)行或運(yùn)算相組合。如如style=CS_VREDRAW| CS_HREDRAW| CS_NOCLOSE。如果希望在某一變量原有的幾個(gè)特征上去掉其中一個(gè)如果希望在某一變量原有的
16、幾個(gè)特征上去掉其中一個(gè)特征,用取反之后再進(jìn)行與運(yùn)算就能夠?qū)崿F(xiàn)。特征,用取反之后再進(jìn)行與運(yùn)算就能夠?qū)崿F(xiàn)。如如styl& CS_NOCLOSE。窗口類的類型窗口類的類型設(shè)計(jì)窗口類設(shè)計(jì)窗口類窗口過程函數(shù)typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuN
17、ame; LPCWSTR lpszClassName; HICON hIconSm; WNDCLASSEXW回調(diào)函數(shù)的原理回調(diào)函數(shù)的原理:當(dāng)應(yīng)用程序收到給某一窗口的消息時(shí):當(dāng)應(yīng)用程序收到給某一窗口的消息時(shí)(消息通常與窗口相關(guān)),就應(yīng)該調(diào)用某一函數(shù)來處理這(消息通常與窗口相關(guān)),就應(yīng)該調(diào)用某一函數(shù)來處理這條消息。這一調(diào)用過程不用應(yīng)用程序自己來實(shí)施,而由操條消息。這一調(diào)用過程不用應(yīng)用程序自己來實(shí)施,而由操作系統(tǒng)來完成,但是,回調(diào)函數(shù)本身的代碼必須由應(yīng)用程作系統(tǒng)來完成,但是,回調(diào)函數(shù)本身的代碼必須由應(yīng)用程序自己完成。對于一條消息,操作系統(tǒng)到底調(diào)用應(yīng)用程序序自己完成。對于一條消息,操作系統(tǒng)到底調(diào)用應(yīng)用
18、程序中的哪個(gè)函數(shù)(回調(diào)函數(shù))來處理呢?操作系統(tǒng)調(diào)用的就中的哪個(gè)函數(shù)(回調(diào)函數(shù))來處理呢?操作系統(tǒng)調(diào)用的就是接受消息的窗口所屬的類型中的是接受消息的窗口所屬的類型中的lpfnWndProc成員指成員指定的函數(shù)。每一種不同類型的窗口都有自己專用的回調(diào)函定的函數(shù)。每一種不同類型的窗口都有自己專用的回調(diào)函數(shù),該函數(shù)是通過數(shù),該函數(shù)是通過lpfnWndProc成員指定的。成員指定的。 窗口過程函數(shù)窗口過程函數(shù)汽車廠家生產(chǎn)汽車好比應(yīng)用程序創(chuàng)建窗口,用戶使用汽車廠家生產(chǎn)汽車好比應(yīng)用程序創(chuàng)建窗口,用戶使用汽車好比操作系統(tǒng)管理窗口,某種汽車在銷售前就指汽車好比操作系統(tǒng)管理窗口,某種汽車在銷售前就指定好了修理站(
19、類似回調(diào)函數(shù)),當(dāng)用戶的汽車出現(xiàn)定好了修理站(類似回調(diào)函數(shù)),當(dāng)用戶的汽車出現(xiàn)故障后(類似窗口接受到消息),汽車用戶(類似操故障后(類似窗口接受到消息),汽車用戶(類似操作系統(tǒng))自己直接找到修理站去修理,不用廠家(類作系統(tǒng))自己直接找到修理站去修理,不用廠家(類似應(yīng)用程序)親自將車送到修理站去修理,但修理站似應(yīng)用程序)親自將車送到修理站去修理,但修理站還得由廠家事先建造好。還得由廠家事先建造好。窗口過程函數(shù)窗口過程函數(shù)typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtr
20、a; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBac kground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; HICON hIconSm; WNDCLASSEXW設(shè)計(jì)窗口類設(shè)計(jì)窗口類類的額外參數(shù)窗口的實(shí)例句柄光標(biāo)的句柄畫刷的句柄菜單的名字類的名字圖標(biāo)的句柄小圖標(biāo)的句柄創(chuàng)建窗口創(chuàng)建窗口HWND CreateWindow( HWND CreateWindow( LPCTSTRLPCTSTR lpClassName, , /已注冊的窗口
21、類的名字LPCTSTRLPCTSTR lpWindowName, , / 窗口的名字,即標(biāo)題欄上顯示的文字 DWORDDWORD dwStyle, , / 窗口的類型 intint x, , / 窗口顯示時(shí)左上角的x坐標(biāo)intint y, , /窗口顯示時(shí)左上角的y坐標(biāo)intint nWidth, , / 窗口寬度 intint nHeight, , / 窗口高度 HWNDHWND hWndParent, , / 父窗口的句柄 HMENUHMENU hMenu, , / 菜單的句柄 HINSTANCEHINSTANCE hInstance, , / 實(shí)例的句柄 LPVOIDLPVOID lpP
22、aram / 與窗口相關(guān)的附加參數(shù) ););消息循環(huán)消息循環(huán)hAccelTable =LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_WINMAIN2); 裝載指定的加速鍵表。(加速鍵就是比如你按Ctrl+N會(huì)新建文檔,Ctrl+S會(huì)保存文檔,這些組合鍵就是加速鍵。使用加速鍵首先要建立加速鍵的資源,然后在程序初始化的時(shí)候LoadAccelerators,然后在WinMain主消息循環(huán)中調(diào)用TranslateAccelerator)GetMessage是從消息隊(duì)列中取消息,操作系統(tǒng)會(huì)為是從消息隊(duì)列中取消息,操作系統(tǒng)會(huì)為每個(gè)應(yīng)用程序建立一個(gè)消息隊(duì)列。每
23、個(gè)應(yīng)用程序建立一個(gè)消息隊(duì)列。BOOL GetMessage( LPMSG lpMsg, / 消息消息 HWND hWnd, / 窗口句柄,表明從哪個(gè)窗口的消息隊(duì)列中取消息。窗口句柄,表明從哪個(gè)窗口的消息隊(duì)列中取消息。 UINT wMsgFilterMin, / 消息的最小值消息的最小值 UINT wMsgFilterMax / 消息的最大值消息的最大值 );消息循環(huán)消息循環(huán)通過指定消息的通過指定消息的范圍來過濾消息。范圍來過濾消息。如果都為如果都為0,則,則沒有消息的過濾沒有消息的過濾消息循環(huán)消息循環(huán)TranslateAccelerator(msg.hwnd, hAccelTable, &am
24、p;msg);(當(dāng)你定義的組合鍵出現(xiàn)時(shí),該函數(shù)會(huì)把這個(gè)組合鍵消息翻譯成hwnd對應(yīng)的窗口的WM_COMMAND消息,并直接Send到窗口過程,得到處理后該函數(shù)才返回)該函數(shù)翻譯成功時(shí)返回非0值,如果失敗,則返回0值即成功時(shí)就不需再調(diào)用TranslateMessage和DispatchMessage函數(shù)BOOL TranslateMessage( const MSG *lpMsg );/翻譯消息翻譯消息就是對取到的消息對進(jìn)行轉(zhuǎn)換。就是對取到的消息對進(jìn)行轉(zhuǎn)換。當(dāng)我們按下鍵盤上的某一個(gè)按鍵時(shí),系統(tǒng)會(huì)產(chǎn)生當(dāng)我們按下鍵盤上的某一個(gè)按鍵時(shí),系統(tǒng)會(huì)產(chǎn)生WM_KEYDOWN和和WM_KEYUP兩個(gè)消息,并且參
25、數(shù)中提供這個(gè)鍵的虛擬掃描碼。兩個(gè)消息,并且參數(shù)中提供這個(gè)鍵的虛擬掃描碼。但用戶按下某個(gè)鍵,可能需要知道具體按下的是哪個(gè)字符,在但用戶按下某個(gè)鍵,可能需要知道具體按下的是哪個(gè)字符,在消息的附加參數(shù)中提供該鍵的消息的附加參數(shù)中提供該鍵的ASCII碼。碼。TranslateMessage會(huì)將會(huì)將WM_KEYDOWN和和WM_KEYUP兩個(gè)消息轉(zhuǎn)兩個(gè)消息轉(zhuǎn)換成換成WM_CHAR消息,并且將轉(zhuǎn)換好的消息投遞到消息隊(duì)列消息,并且將轉(zhuǎn)換好的消息投遞到消息隊(duì)列中。這個(gè)轉(zhuǎn)換過程不會(huì)影響原來的消息,只會(huì)產(chǎn)生一個(gè)新消息。中。這個(gè)轉(zhuǎn)換過程不會(huì)影響原來的消息,只會(huì)產(chǎn)生一個(gè)新消息。如果我們不用這個(gè)函數(shù),則收不到如果我們不
26、用這個(gè)函數(shù),則收不到WM_CHAR消息。消息。消息循環(huán)消息循環(huán)DispatchMessage函數(shù)的作用是將收到的消息傳給函數(shù)的作用是將收到的消息傳給窗口的回調(diào)函數(shù),即窗口過程函數(shù)去處理。可以這樣窗口的回調(diào)函數(shù),即窗口過程函數(shù)去處理??梢赃@樣理解,該函數(shù)將消息路由給了操作系統(tǒng),操作系統(tǒng)通理解,該函數(shù)將消息路由給了操作系統(tǒng),操作系統(tǒng)通過調(diào)用窗口過程函數(shù)去處理消息。這個(gè)窗口過程函數(shù)過調(diào)用窗口過程函數(shù)去處理消息。這個(gè)窗口過程函數(shù)就是在就是在設(shè)計(jì)窗口類時(shí)設(shè)計(jì)窗口類時(shí)指定的。指定的。每當(dāng)從消息隊(duì)列中取到一條消息時(shí),都會(huì)調(diào)用窗口過每當(dāng)從消息隊(duì)列中取到一條消息時(shí),都會(huì)調(diào)用窗口過程函數(shù)。因此在該函數(shù)中我們要判讀
27、是哪個(gè)消息。用程函數(shù)。因此在該函數(shù)中我們要判讀是哪個(gè)消息。用的是的是SWITCH語句。語句。消息循環(huán)消息循環(huán)設(shè)計(jì)窗口類設(shè)計(jì)窗口類窗口過程函數(shù)typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBac kground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; HIC
28、ON hIconSm; WNDCLASSEXW是調(diào)用的約定。是調(diào)用的約定。vc+中有中有2種調(diào)用約定。一種是標(biāo)準(zhǔn)的調(diào)用約種調(diào)用約定。一種是標(biāo)準(zhǔn)的調(diào)用約定,一種是定,一種是C語言的調(diào)用約定。標(biāo)準(zhǔn)的調(diào)用約定就是語言的調(diào)用約定。標(biāo)準(zhǔn)的調(diào)用約定就是PASCAL的調(diào)用。主要是參數(shù)傳遞的順序以及堆棧的清除有些差異。除的調(diào)用。主要是參數(shù)傳遞的順序以及堆棧的清除有些差異。除了可變參數(shù)的函數(shù)外,其余的函數(shù)都是了可變參數(shù)的函數(shù)外,其余的函數(shù)都是STDCALL的調(diào)的調(diào)用習(xí)慣,但是用習(xí)慣,但是c+的編譯環(huán)境,缺省下是的編譯環(huán)境,缺省下是cdecl的調(diào)用約定。的調(diào)用約定。所以在所以在vc+中要調(diào)用中要調(diào)用stdcall
29、這樣調(diào)用約定的這樣調(diào)用約定的API函數(shù)的話,就函數(shù)的話,就要在函數(shù)原型前說明要在函數(shù)原型前說明stdcall,回調(diào)函數(shù)也應(yīng)該是。,回調(diào)函數(shù)也應(yīng)該是。CALLBACK操作系統(tǒng)會(huì)在多個(gè)不同的時(shí)機(jī)發(fā)送操作系統(tǒng)會(huì)在多個(gè)不同的時(shí)機(jī)發(fā)送WM_PAINT消息:消息:(1)當(dāng)?shù)谝淮蝿?chuàng)建一個(gè)窗口時(shí))當(dāng)?shù)谝淮蝿?chuàng)建一個(gè)窗口時(shí)(2)當(dāng)改變窗口的大小時(shí))當(dāng)改變窗口的大小時(shí)(3)當(dāng)把窗口從另一個(gè)窗口背后移出時(shí))當(dāng)把窗口從另一個(gè)窗口背后移出時(shí)(4)當(dāng)最大化或最小化窗口時(shí)等等)當(dāng)最大化或最小化窗口時(shí)等等這些動(dòng)作都是由系統(tǒng)管理的,應(yīng)用只是被動(dòng)地接收該消這些動(dòng)作都是由系統(tǒng)管理的,應(yīng)用只是被動(dòng)地接收該消息,在消息響應(yīng)中進(jìn)行繪制操作
30、;息,在消息響應(yīng)中進(jìn)行繪制操作; WM_PAINT消消 息息Windows程序的生與死程序的生與死(1)程序初始化過程中調(diào)用)程序初始化過程中調(diào)用CreateWindow,為程序,為程序建立一個(gè)窗口。建立一個(gè)窗口。CreateWindow產(chǎn)生窗口之后會(huì)發(fā)送產(chǎn)生窗口之后會(huì)發(fā)送WM_CREATE消息給窗口函數(shù)。消息給窗口函數(shù)。(2)在程序運(yùn)行的過程中,不斷用)在程序運(yùn)行的過程中,不斷用GetMessage函數(shù)函數(shù)從消息隊(duì)列中抓取消息。如果該消息是從消息隊(duì)列中抓取消息。如果該消息是WM_QUIT,GetMessage會(huì)傳回會(huì)傳回0而結(jié)束而結(jié)束while循環(huán),進(jìn)而結(jié)束整個(gè)循環(huán),進(jìn)而結(jié)束整個(gè)程序。程序。
31、(3)DispatchMessag把消息派送到窗口函數(shù)。消息把消息派送到窗口函數(shù)。消息將在窗口函數(shù)中被判讀并處理。將在窗口函數(shù)中被判讀并處理。(4)程序不斷進(jìn)行()程序不斷進(jìn)行(2)和()和(3)的操作。)的操作。Windows程序的生與死程序的生與死(5)當(dāng)按下系統(tǒng)菜單中的)當(dāng)按下系統(tǒng)菜單中的Close命令時(shí),系統(tǒng)發(fā)送命令時(shí),系統(tǒng)發(fā)送WM_CLOSE消息。一般程序的窗口函數(shù)不需要處理該消息,消息。一般程序的窗口函數(shù)不需要處理該消息,于是于是DefWindowProc處理它。處理它。(6)DefWindowProc收到收到WM_CLOSE后,調(diào)用后,調(diào)用DestroyWindow把窗口清除。把
32、窗口清除。DestroyWindow本身又會(huì)發(fā)本身又會(huì)發(fā)送送WM_DESTROY消息。消息。(7)程序?qū)Γ┏绦驅(qū)M_DESTROY消息的反應(yīng)是調(diào)用消息的反應(yīng)是調(diào)用PostQuitMessage。(8)PostQuitMessage沒什么其它操作,只是送出沒什么其它操作,只是送出WM_QUIT消息,準(zhǔn)備讓消息循環(huán)中的消息,準(zhǔn)備讓消息循環(huán)中的GetMessage取得,如取得,如(2)所示,結(jié)束消息循環(huán)。)所示,結(jié)束消息循環(huán)。WNDCLASSEX wcex;wcex.cbSize= sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wc
33、ex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_HELLO);wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= (LPCSTR)IDC_HELLO;wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)ID
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 25246-2025畜禽糞肥還田技術(shù)規(guī)范
- 2025年常德c1貨運(yùn)從業(yè)資格證考試內(nèi)容
- 兒童桌子采購合同范本
- 鄉(xiāng)鎮(zhèn)飯店轉(zhuǎn)讓合同范本
- 公司房租轉(zhuǎn)租合同范本
- 倉庫裝修合同范本版
- 上海廠房出售合同范本
- 茶器定制合同范本
- 中標(biāo)咨詢合同范本
- 農(nóng)村訂購混泥土合同范本
- 2023年中國農(nóng)業(yè)大學(xué)人才招聘筆試真題
- GB/T 44619-2024福壽螺檢疫鑒定方法
- 2024年湖南省公務(wù)員錄用考試《行測》試題及答案解析
- 北京聯(lián)合大學(xué)《電子技術(shù)基礎(chǔ)》2022-2023學(xué)年期末試卷
- 電力工程質(zhì)量驗(yàn)收手冊
- 四年級語文下冊 期末復(fù)習(xí)文言文閱讀專項(xiàng)訓(xùn)練(一)(含答案)(部編版)
- 學(xué)習(xí)新課程標(biāo)準(zhǔn)的方案
- 2024年知識競賽-煙花爆竹安全管理知識競賽考試近5年真題附答案
- 民航基礎(chǔ)知識應(yīng)用題庫100道及答案解析
- 2024年黑龍江省哈爾濱市中考數(shù)學(xué)試卷(附答案)
- SolidWorks-2020項(xiàng)目教程全套課件配套課件完整版電子教案
評論
0/150
提交評論