訊息迴圈

概念,訊息內容,訊息迴圈結構構成,

概念

呼叫UpdateWindow之後,視窗就出現在視訊顯示器上。程式現在必須準備讀入使用者用鍵盤和滑鼠輸入的資料。Windows為當前執行的每個Windows程式維護一個「訊息佇列」。在發生輸入事件之後,Windows將事件轉換為一個「訊息」並將訊息放入程式的訊息佇列中。

訊息內容

程式通過執行一塊稱之為「訊息迴圈」的程式碼從訊息佇列中取出訊息:
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
msg變數是型態為MSG的結構,型態MSG在WINUSER.H中定義如下:
typedef struct tagMSG
{
HWND hwnd ;
UINT message ;
WPARAM wParam ;
LPARAM lParam ;
DWORD time ;
POINT pt ;
}
MSG, * PMSG ;
POINT資料型態也是一個結構,它在WINDEF.H中定義如下:
typedef struct tagPOINT
{
LONG x ;
LONG y ;
}
POINT, * PPOINT;
訊息迴圈以GetMessage呼叫開始,它從訊息佇列中取出一個訊息:
GetMessage (&msg, NULL, 0, 0)

訊息迴圈結構構成

這一呼叫傳給Windows一個指標,指向名為msg的MSG結構。第二、第三和第四個參數設定為NULL或者0,表示程式接收它自己建立的所有視窗的所有訊息。Windows用從訊息佇列中取出的下一個訊息來填充訊息結構的各個欄位,結構的各個欄位包括:
hwnd 接收訊息的視窗代號。在HELLOWIN程式中,這一參數與CreateWindow傳回的hwnd值相同,因為這是該程式擁有的唯一視窗。
message 訊息識別字。這是一個數值,用以標識訊息。對於每個訊息,均有一個對應的識別字,這些識別字定義於Windows表頭檔案(其中大多數在WINUSER.H中),以字首WM(「window message」,視窗訊息)開頭。例如,使用者將滑鼠游標放在HELLOWIN顯示區域之內,並按下滑鼠左按鈕,Windows就在訊息佇列中放入一個訊息,該訊息的message欄位等於WM_LBUTTONDOWN。這是一個常數,其值為0x0201。
wParam 一個32位元的「message parameter(訊息參數)」,其含義和數值根據訊息的不同而不同。
lParam 一個32位元的訊息參數,其值與訊息有關。
time 訊息放入訊息佇列中的時間。
pt 訊息放入訊息佇列時的滑鼠坐標。
只要從訊息佇列中取出訊息的message欄位不為WM_QUIT(其值為0x0012),GetMessage就傳回一個非零值。WM_QUIT訊息將導致GetMessage傳回0。
敘述
TranslateMessage (&msg) ;
將msg結構傳給Windows,進行一些鍵盤轉換。(關於這一點,我們將在第六章中深入討論。)
敘述
DispatchMessage (&msg) ;
又將msg結構回傳給Windows。然後,Windows將該訊息傳送給適當的視窗訊息處理程式,讓它進行處理。這也就是說,Windows將呼叫視窗訊息處理程式。在HELLOWIN中,這個視窗訊息處理程式就是WndProe函式。處理完訊息之後,WndProc傳回到Windows。此時,Windows還停留在DispatchMessage呼叫中。在結束DispatchMessage呼叫的處理之後,Windows回到HELLOWIN,並且接著從下一個GetMessage呼叫開始訊息迴圈。

熱門詞條

聯絡我們