windows程序中的消息

本文介绍了Windows程序中几个关键的消息处理,包括WM_GETMINMAXINFO、WM_NCCREATE和WM_NCCALCSIZE。这些消息在窗口大小位置改变、创建及客户区计算时发送,并详细阐述了如何利用它们来定制窗口行为,如全屏设置和非客户区控制。
摘要由CSDN通过智能技术生成

进入消息处理函数中的消息

  1. WM_GETMINMAXINFO (0x24)
    当窗口的大小或者位置将要改变时直接发送(Sent)至窗口处理函数,说明不经过消息循环,应用程序可以使用该消息来改写窗口的默认最大尺寸和默认最大位置或者其默认最小、最大跟踪尺寸,举例如下:
	case WM_GETMINMAXINFO:
	{
		POINT pt;
		pt.x = GetSystemMetrics(SM_CXSCREEN) - 10;
		pt.y = GetSystemMetrics(SM_CYSCREEN) - 10;
		((MINMAXINFO*)lParam)->ptMaxSize = pt;
		pt.x = 5;
		pt.y = 5;
		((MINMAXINFO*)lParam)->ptMaxPosition = pt;
		return 0;
	}

该消息的lParam实质为一个MINMAXINFO指针,通过改变该指针指向的结构体内的成员变量的大小,例如ptMaxSize表示最大化的大小,ptMaxPosition表示最大化时左上角的位置。这里引申出一个问题,我能不能让最大化为全屏窗口?最后发现不行,总是会剩下任务栏去不掉,那全屏窗口如何实现呢?
若要使窗口全屏,该窗口必须没有标题栏,最好为POPUPWINDOW,代码如下所示。首先通过GetDesktopWindow函数获得桌面窗口句柄,通过GetWindowRect函数获得桌面窗口句柄的尺寸矩形,通过SetWindowLong去除窗口的标题栏,使其看起来像弹出窗口,最后通过SetWindowPos函数设置窗口的位置与大小。

	case ID_FULLSCREEN:
		HWND   hDesk;
		RECT   rc;
		hDesk = GetDesktopWindow();
		GetWindowRect(hDesk, &rc);
		SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);		//不能没有
		SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, rc.right, rc.bottom, SWP_SHOWWINDOW);
		return 0;
  1. WM_NCCREATE (0x81)
    根据MSDN的解释,当窗口首次创建时,该消息先于WM_CREATE被Sent到窗口处理函数。所以也是不经过消息循环的。该消息的lParam实际为一个指向CREATESTRUCT的指针,如果你需要通过甲程序更改乙程序的窗口的属性,则可以通过HOOK消息拦截技术拦截该消息并修改该参数。
  2. WM_NCCALCSIZE (0x83)
    当窗口的客户区必须被计算时Sent至窗口处理函数。通过处理该消息,应用程序能在窗口的位置和尺寸发生变化时仍可以控制窗口客户区的内容。wParam可为TRUE或者FALSE,当窗口刚创建时的第一个WM_NCCALCSIZEwParam为FALSE,其余时候一般为TRUE。当wParam为TRUE时,表明应用程序应该说明客户区的哪部分包含着有效信息。操作系统复制这些有效信息至新客户区内的特定区域;若wParam为FALSE时则不需要这样做。
    wParam为TRUE,lParam为一个指向NCCALCSIZE_PARAMS结构体的指针,该结构体内包含了应用程序可以用来计算客户区域矩形新的尺寸和位置的信息;若wParam为FALSE,lParam为一个指向RECT结构体的指针。处理该消息时若直接返回0则窗口不存在非客户区,这样就可以自己在客户区内绘制非客户区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值