(二)創(chuàng)建窗口
注冊(cè)窗口類后,就可以創(chuàng)建窗口了,本程序中創(chuàng)建窗口的有關(guān)語(yǔ)句如下:
hwnd = CreateWindow (szAppName, // window class name
TEXT ("歡迎你的到來(lái)!"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
參數(shù)1:登記的窗口類名,這個(gè)類名剛才咱們?cè)谧?cè)窗口時(shí)已經(jīng)定義過(guò)了。
參數(shù)2:用來(lái)表明窗口的標(biāo)題。
參數(shù)3: 用來(lái)表明窗口的風(fēng)格,如有無(wú)最大化,最小化按紐啊什么的。
參數(shù)4,5: 用來(lái)表明程序運(yùn)行后窗口在屏幕中的坐標(biāo)值。
參數(shù)6,7: 用來(lái)表明窗口初始化時(shí)(即程序初運(yùn)行時(shí))窗口的大小,即長(zhǎng)度與寬度。
參數(shù)8: 在創(chuàng)建窗口時(shí)可以指定其父窗口,這里沒(méi)有父窗口則參數(shù)值為0。
參數(shù)9: 用以指明窗口的菜單,菜單以后會(huì)講,這里暫時(shí)為0。
最后一個(gè)參數(shù)是附加數(shù)據(jù),一般都是0。
CreateWindow()的返回值是已經(jīng)創(chuàng)建的窗口的句柄,應(yīng)用程序使用這個(gè)句柄來(lái)引用該窗口。如果返回值為0,就應(yīng)該終止該程序,因?yàn)榭赡苣硞€(gè)地方出錯(cuò)了。如果一個(gè)程序創(chuàng)建了多個(gè)窗口,則每個(gè)窗口都有各自不同的句柄.
(三)顯示和更新窗口
API函數(shù)CreateWindow創(chuàng)建完窗口后,要想把它顯示出現(xiàn),還必須調(diào)用另一個(gè)API函數(shù)ShowWindows.形式為:
ShowWindow (hwnd, iCmdShow);其第一個(gè)參數(shù)是窗口句柄,告訴ShowWindow()顯示哪一個(gè)窗口,而第二個(gè)參數(shù)則告訴它如何顯示這個(gè)窗口:最小化(SW_MINIMIZE),普通(SW_SHOWNORMAL),還是最大化(SW_SHOWMAXIMIZED)。WinMain在創(chuàng)建完窗口后就調(diào)用ShowWindow函數(shù),并把iCmdShow參數(shù)傳送給這個(gè)窗口。你可把iCmdShow改變?yōu)檫@些參數(shù)試試。
WinMain()調(diào)用完ShowWindow后,還需要調(diào)用函數(shù)UpdateWindow,最終把窗口顯示了出來(lái)。調(diào)用函數(shù)UpdateWindow將產(chǎn)生一個(gè)WM_PAINT消息,這個(gè)消息將使窗口重畫,即使窗口得到更新.
(四)創(chuàng)建消息循環(huán)
主窗口顯示出來(lái)了,WinMain就開始處理消息了,怎么做的呢?
Windows為每個(gè)正在運(yùn)行的應(yīng)用程序都保持一個(gè)消息隊(duì)列。當(dāng)你按下鼠標(biāo)或者鍵盤時(shí),Windows并不是把這個(gè)輸入事件直接送給應(yīng)用程序,而是將輸入的事件先翻譯成一個(gè)消息,然后把這個(gè)消息放入到這個(gè)應(yīng)用程序的消息隊(duì)列中去。應(yīng)用程序又是怎么來(lái)接收這個(gè)消息呢?這就講講消息循環(huán)了。
應(yīng)用程序的WinMain函數(shù)通過(guò)執(zhí)行一段代碼從她的隊(duì)列中來(lái)檢索Windows送往她的消息。然后WinMain就把這些消息分配給相應(yīng)的窗口函數(shù)以便處理它們,這段代碼是一段循環(huán)代碼,故稱為"消息循環(huán)"。這段循環(huán)代碼是什么呢?好,往下看:
在咱們的第二只小板凳中,這段代碼就是:
......
MSG msg; //定義消息名
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ; //翻譯消息
DispatchMessage (&msg) ; //撤去消息
}
return msg.wParam ;
MSG結(jié)構(gòu)在頭文件中定義如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
MSG數(shù)據(jù)成員意義如下:
參數(shù)1:hwnd是消息要發(fā)送到的那個(gè)窗口的句柄,這個(gè)窗口就是咱們用CreateWindows函數(shù)創(chuàng)建的那一個(gè)。如果是在一個(gè)有多個(gè)窗口的應(yīng)用程序中,用這個(gè)參數(shù)就可決定讓哪個(gè)窗口接收消息。
參數(shù)2:message是一個(gè)數(shù)字,它唯一標(biāo)識(shí)了一種消息類型。每種消息類型都在Windows文件中定義了,這些常量都以WM_開始后面帶一些描述了消息特性的名稱。比如說(shuō)當(dāng)應(yīng)用程序退出時(shí),Windows就向應(yīng)用程序發(fā)送一條WM_QUIT消息。
參數(shù)3:一個(gè)32位的消息參數(shù),這個(gè)值的確切意義取決于消息本身。
參數(shù)4:同上。
參數(shù)5:消息放入消息隊(duì)列中的時(shí)間,在這個(gè)域中寫入的并不是日期,而是從Windows啟動(dòng)后所測(cè)量的時(shí)間值。Windows用這個(gè)域來(lái)使用消息保持正確的順序。
參數(shù)6:消息放入消息隊(duì)列時(shí)的鼠標(biāo)坐標(biāo).
消息循環(huán)以GetMessage調(diào)用開始,它從消息隊(duì)列中取出一個(gè)消息:
GetMessage(&msg,NULL,0,0),第一個(gè)參數(shù)是要接收消息的MSG結(jié)構(gòu)的地址,第二個(gè)參數(shù)表示窗口句柄,NULL則表示要獲取該應(yīng)用程序創(chuàng)建的所有窗口的消息;第三,四參數(shù)指定消息范圍。后面三個(gè)參數(shù)被設(shè)置為默認(rèn)值,這就是說(shuō)你打算接收發(fā)送到屬于這個(gè)應(yīng)用程序的任何一個(gè)窗口的所有消息。在接收到除WM_QUIT之外的任何一個(gè)消息后,GetMessage()都返回TRUE。如果GetMessage收到一個(gè)WM_QUIT消息,則返回FALSE,如收到其他消息,則返回TRUE。因此,在接收到WM_QUIT之前,帶有GetMessage()的消息循環(huán)可以一直循環(huán)下去。只有當(dāng)收到的消息是WM_QUIT時(shí),GetMessage才返回FALSE,結(jié)束消息循環(huán),從而終止應(yīng)用程序。 均為NULL時(shí)就表示獲取所有消息。
消息用GetMessage讀入后(注意這個(gè)消息可不是WM_QUIT消息),它首先要經(jīng)過(guò)函數(shù)TranslateMessage()進(jìn)行翻譯,這個(gè)函數(shù)會(huì)轉(zhuǎn)換成一些鍵盤消息,它檢索匹配的WM_KEYDOWN和WM_KEYUP消息,并為窗口產(chǎn)生相應(yīng)的ASCII字符消息(WM_CHAR),它包含指定鍵的ANSI字符.但對(duì)大多數(shù)消息來(lái)說(shuō)它并不起什么作用,所以現(xiàn)在沒(méi)有必要考慮它。
下一個(gè)函數(shù)調(diào)用DispatchMessage()要求Windows將消息傳送給在MSG結(jié)構(gòu)中為窗口所指定的窗口過(guò)程。我們?cè)谥v到登記窗口類時(shí)曾提到過(guò),登記窗口類時(shí),我們?cè)付╓indows把函數(shù)WindosProc作為咱們這個(gè)窗口的窗口過(guò)程(就是指處理這個(gè)消息的東東)。就是說(shuō),Windows會(huì)調(diào)用函數(shù)WindowsProc()來(lái)處理這個(gè)消息。在WindowProc()處理完消息后,代碼又循環(huán)到開始去接收另一個(gè)消息,這樣就完成了一個(gè)消息循環(huán)。
聯(lián)系客服