本笔记源自windows游戏编程大师技巧第二版3.4章,记做学习随笔。
使用vs2017环境编译。
来实例一些常用的Windows消息处理:
注意!在window消息处理时,常常需要对一个消息取高低字节,以得到两个不同的消息,举例说明:
使用LOWORD()和HIWORD()对wparam和lparam进行取高低字节
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
//其他消息
case WM_ACTIVATE:
{
if (LOWORD(wparam) == WA_CLICKACTIVE) //使用LOEORD()是取得低字节,这里是判断是否用鼠标激活了窗口
{
//处理内容
}
if (HIWORD(wparam) == true) //使用HIWORD()是取得高字节,这里是判断窗口是否被激活
{
//处理内容
}
}
default:
break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
WM_ACRIVATE 当某个窗口被激活或者销毁时传递
参数:
fActive = LOWORD(wParam); // activation flag
fMinimized = (BOOL)HIWORD(wParam); // minimized flag
hwndPrevious= (HWND)lParam; // window handle
fActive 参数表明窗口是被激活还是被取消。该信息保存在 wParam 的低阶字中,可以取以下的值:
WA_CLICKACTIVE | 通过鼠标单击激活了该窗口 |
WA_ACTIVE | 通过鼠标以外的工具(如键盘)激活了该窗口 |
WA_INACTIVE | 取消该窗口的激活 |
fMinimized 参数表明窗口是否为最小化状态。该信息保存在 wParam 的高阶字中,非0表示最小化,0表示不是最小化
hwndPrevious 参数声明消息是来自哪个窗口。
示例代码:把他放到WndProc即可,你先点击其他窗口,在点击他,即可弹窗。
case WM_ACTIVATE:
{
if (LOWORD(wparam) == WA_CLICKACTIVE) //判断鼠标激活窗口
{
MessageBox(NULL, "窗口", "你用鼠标激活了窗口", MB_OK);
}break;
}
WM_CLOSE 当窗口即将被关闭时传递,也就是点击右上角的x后传递
如果此消息设置为 return(0) 窗口将不会被关闭,只有返回DefWindowProc(hwnd, msg, wparam, lparam)才会关闭。
参数:无
实例代码:做一个挽留用户关闭的效果
case WM_CLOSE:
{
int i = MessageBox(hwnd, "你确定要关闭窗口吗?", "提示", MB_YESNO); //关闭窗口弹出
if (i == IDYES)
{
return (DefWindowProc(hwnd, msg, wparam, lparam)); //这样返回关闭窗口
}
return 0; //这样返回没反应
}break;
WM_SIZE 窗口尺寸做出变化,或者最小化最大化将会传递
参数:
fwSizeType = wParam
nWidth(窗口的宽) = LOWORD(Iparam)
nHeight(窗口的高) = HIWORD(Iparam)
示例程序:这个程序会显示当前窗口宽高,并且最大化窗口会有提示
case WM_SIZE:
{
char i[80];
int x1 = LOWORD(lparam);
int y1 = LOWORD(lparam);
hdc = BeginPaint(hwnd, &ps);
sprintf_s(i, "x = %d,y = %d \0", x1, y1);
TextOut(hdc, 0, 0, i, strlen(i));
EndPaint(hwnd, &ps);
if (wparam == SIZE_MAXIMIZED)
{
MessageBox(NULL, "窗口最大化了", "提示", MB_OK);
}
return 0;
}break;
WM_MOVE 消息在一个窗口移动时发送
参数:
xPos = (int)LOWORD(Iparam)
yPos = (int)HIWORD(Iparam)
示例源码:
case WM_MOVE:
{
char i[80];
int x1 = LOWORD(lparam);
int y1 = HIWORD(lparam);
hdc = GetDC(hwnd);
sprintf_s(i, "moveX = %d,moveY = %d \0", x1, y1);
TextOut(hdc, 0, 0, i, strlen(i));
ReleaseDC(hwnd,hdc);
}break;