windows编程笔记【七】处理重要消息

本笔记源自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;
		}

windows编程笔记【七】处理重要消息_第1张图片

 

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;

windows编程笔记【七】处理重要消息_第2张图片

 

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;

windows编程笔记【七】处理重要消息_第3张图片

 

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;

windows编程笔记【七】处理重要消息_第4张图片

你可能感兴趣的:(windows)