消息
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返回值必须由窗口消息处理程序返回