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返回值必须由窗口消息处理程序返回
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值