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