windows——消息

消息

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返回值必須由窗口消息處理程序返回
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章