消息
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG;
解釋:
- hwnd:接收消息的窗口句柄
- message:消息ID
- wParam:32位消息參數,含義和數值根據消息不同而不同
- lParam:32位消息參數,含義和數值根據消息不同而不同
- time:消息放入消息隊列中時間
- pt:消息放入消息隊列時鼠標座標
消息循環
windows爲當前執行的每個windows程序維護一個消息隊列,windows將各種事件轉換爲一條消息並將消息放入程序消息隊列中
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
注意:
- 只要從消息隊列中取出消息的message字段不爲WM_QUIT,GetMessage就返回非0值,消息循環就一直進行,WM_QUIT消息將導致GetMessage返回0,消息循環結束
- TranslateMessage進行一些鍵盤轉換
- DispatchMessage將促使windows將消息發送給適當的窗口消息處理程序進行消息處理,即DispatchMessage將促使windows調用窗口消息處理程序進行消息處理
- 消息處理結束之後,返回到windows,windows此時還停留在DispatchMessage中,結束DispatchMessage調用後,進行下一次消息循環
窗口消息處理程序
一個windows程序可包含多個窗口消息處理程序,一個窗口消息處理程序總是與註冊的特定窗口類別相關聯
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_CREATE:
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Hello, Windows!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam) ;
}
注意:
- 窗口消息處理程序原型一致,LRESULT CALLBACK (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- 窗口消息處理程序四個參數與msg結構前四個字段相同
- 程序通常不直接調用窗口消息處理程序,窗口消息處理程序通常由windows本身呼叫,通過調用SendMessage,程序能夠直接調用窗口消息處理程序
- 窗口消息處理程序在處理消息時,必須返回0
- 窗口消息處理程序不予處理的所有消息應該被傳給DefWindowProc進行內定默認處理
- DefWindowProc返回值必須由窗口消息處理程序返回