进入消息处理函数中的消息
- 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;
- WM_NCCREATE (0x81)
根据MSDN的解释,当窗口首次创建时,该消息先于WM_CREATE被Sent到窗口处理函数。所以也是不经过消息循环的。该消息的lParam实际为一个指向CREATESTRUCT的指针,如果你需要通过甲程序更改乙程序的窗口的属性,则可以通过HOOK消息拦截技术拦截该消息并修改该参数。 - WM_NCCALCSIZE (0x83)
当窗口的客户区必须被计算时Sent至窗口处理函数。通过处理该消息,应用程序能在窗口的位置和尺寸发生变化时仍可以控制窗口客户区的内容。wParam可为TRUE或者FALSE,当窗口刚创建时的第一个WM_NCCALCSIZE的wParam为FALSE,其余时候一般为TRUE。当wParam为TRUE时,表明应用程序应该说明客户区的哪部分包含着有效信息。操作系统复制这些有效信息至新客户区内的特定区域;若wParam为FALSE时则不需要这样做。
若wParam为TRUE,lParam为一个指向NCCALCSIZE_PARAMS结构体的指针,该结构体内包含了应用程序可以用来计算客户区域矩形新的尺寸和位置的信息;若wParam为FALSE,lParam为一个指向RECT结构体的指针。处理该消息时若直接返回0则窗口不存在非客户区,这样就可以自己在客户区内绘制非客户区。