WM_NCCALCSIZE message
Saturday, February 22, 2020
9:16 PM
https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-nccalcsize
当必须计算窗口客户区域的大小和位置时,发送该消息。当窗口的位置和大小改变时,通过处理该消息,
应用程序可以控制窗口客户区域的内容。
窗口通过函数 WindowProc 接收该消息。
#define WM_NCCALCSIZE 0x0083
参数
wParam | 若 wParam 为 TRUE,则规定应用程序应指明客户区域的哪部分包含有效信息。 系统拷贝该有效信息到新客户区域的指定区域。 |
lParam | 若 wParam 为 TRUE, lParam 指向 NCCALCSIZE_PARAMS 结构体,应用程序可以使用该结构体计算 客户区域矩形的新位置和大小。 若 wParam 为 FALSE,lParam 指向 RECT 结构体。在进入时,该结构体包含为该窗口的建议窗口矩形。 在退出时,该结构体应该包含相应的窗口客户区域的屏幕坐标。 |
返回值
Type: LRESULT
若参数 wParam 是 FALSE,应用程序应该返回0.
若参数 wParam 是 TRUE ,应用程序应该返回0或以下值的组合。
若参数 wParam 是 TRUE 并且应用程序返回0,旧客户区域被保留将于新客户区域的左上角对齐。
返回代码/值 | 描述 |
WVR_ALIGNTOP 0x0010 | 指定要保留的窗口客户区域并与窗口新位置的顶部对齐。 例如,要将客户区域与左上角对齐,返回值 WVR_ALIGNTOP 和 WVR_ALIGNLEFT 。 |
WVR_ALIGNRIGHT 0x0080 | 指定要保留的窗口客户区域并与窗口新位置的右端对齐。 例如,要将客户区域与右下角对齐,返回值 WVR_ALIGNRIGHT 和 WVR_ALIGNBOTTOM 。 |
WVR_ALIGNLEFT 0x0020 | 指定要保留的窗口客户区域与窗口新位置的左端对齐。 例如,为将客户区域与左下角对齐,返回值 WVR_ALIGNLEFT 和 WVR_ALIGNBOTTOM 。 |
WVR_ALIGNBOTTOM 0x0040 | 指定要保留的窗口客户区域与窗口新位置的底端对齐。 例如,为将客户区域与左上角对齐,返回值 WVR_ALIGNTOP 和 WVR_ALIGNLEFT 。 |
WVR_HREDRAW 0x0100 | 若窗口客户区域矩形水平改变大小,该值与其他值组合使用,除了 WVR_VALIDRECTS , 会引起窗口的完全重绘。该值与窗口类型值 CS_HREDRAW 相似。 |
WVR_VREDRAW 0x0200 | 若窗口客户区域矩形垂直改变大小,将该值用于除 WVR_VALIDRECTS 外其他值使用, 会引起窗口的完全重绘。该值与 CS_VREDRAW 相似。 |
WVR_REDRAW 0x0300 | 该值引起整个窗口重绘。是 WVR_HREDRAW 和 WVR_VREDRAW 的组合。 |
WVR_VALIDRECTS 0x0400 | 该值表明,当从 WM_NCCALCSIZE 返回时,结构体 NCCALCSIZE_PARAMS 成员 rgrc[1] 要保留的窗口区域。系统拷贝源矩形内的窗口图像的任何部分并裁剪该图像到目标矩形。 两矩形都相对于父坐标或屏幕坐标中。该标志值不能与任何其他值组合。 此返回值允许应用程序实施更复杂的客户区域保留策略,例如居中或保留客户区域的子集。 |
Remarks
窗口可重绘,依赖于是否指定窗口类型值 CS_HREDRAW 和 CS_VREDRAW 。函数 DefWindowProc 对该消息是默认的,
向后兼容的处理(除了上表中描述的常规客户区域矩形的计算外)。
当 wParam 为 TRUE,仅返回0并且没有处理 NCCALCSIZE_PARAMS 矩形会引起将客户区域调整为包含
窗口边框( Window Frame )在内的窗口大小。该处理会移除窗口中的窗口框架(Window Frame)和标题项(Caption items),
仅保留要显示的窗口客户区域。
从 Windows Vista 开始,当 wParam 为 TRUE 时仅返回0可移除标准窗口框架(Window Frame),但不会影响使用
DwmExtendFrameIntoClientArea 函数将 标准 Frame 扩展到客户区域中的 Frame。
仅仅移除标准窗口框架 ( Standard Frame)。
Requirements
最低限度支持客户端 | Windows 2000 Professional ( desktop apps only ) |
最低限度支持服务器 | Windows 2000 Server ( desktop apps only ) |
Header | Winuser.h ( include Windowsx.h ) |