MFC學習(四) 訊息機制

黨偉_90發表於2018-05-04

1 訊息機制的要點:

  訊息佇列:先進先出

  訊息迴圈:通過迴圈while,不斷的從訊息佇列中取得隊首訊息,並分發訊息。

  訊息處理:根據不同的訊息型別做不同的處理

  事件:事件響應函式

2 訊息機制

_tWinMain
{
// 註冊視窗類
if(!AppRegisterClass(hInstance)) // hInstance 是應用程式控制程式碼,把這個和winproc註冊上。
{
return (FALSE);
}
// 初始化應用程式視窗
if (!InitInstance (hInstance, nCmdShow)) // 註冊之後開始初始化應用視窗(createWindow得到g_hWnd ;ShowWindow(); UpdateWIndow)_)
{
return FALSE;
}

// 訊息迴圈
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //定義訊息處理函式

wndProc會根據message型別呼叫對應的事件響應函式。

onDraw () // 每次重新整理的時候都會重新繪製。

對於每一個正在執行的Windows應用程式,系統為其建立一個"訊息佇列",也就是應用程式佇列
DispatchMessage會將訊息傳遞給視窗函式,也就是WndProce函式。
WndProc是一個回撥函式,在註冊視窗時通過wcex.lpfnWndProc將其傳遞給了OS,所以DispatchMessage分發訊息後,OS會呼叫
Wndproc去處理。


訊息的定義和型別:
windows訊息都以WM_為字首,WM_PAINT. 
typedef struct tagMsg

HWND hwnd; //接受該訊息的視窗控制程式碼
UINT message; //訊息常量識別符號,也就是我們通常所說的訊息號
WPARAM wParam; //32位訊息的特定附加資訊,確切含義依賴於訊息值
LPARAM lParam; //32位訊息的特定附加資訊,確切含義依賴於訊息值
DWORD time; //訊息建立時的時間
POINT pt; //訊息建立時的滑鼠/游標在螢幕座標系中的位置
}MSG;

訊息主要有3種型別:
A: 命令訊息:
B: 標準視窗訊息:
C: Notification:


佇列訊息和非佇列訊息: 按照是否需要放入隊裡


POSMessage 與 SendMessage:
POSMessage:傳送到訊息對列
SendMessage:非對列訊息。直接傳送視窗,等待執行結束。

相關文章