当必须计算窗口的客户区域的大小和位置时,会发送WM_NCCALCSIZE消息。通过处理该消息,当窗口的大小或位置改变时,应用程序可以控制窗口的客户区域的内容。
WM_NCCALCSIZE
fCalcValidRects = (BOOL) wParam; //有效区域标志
lpncsp = (LPNCCALCSIZE_PARAMS) lParam; //指向大小计算数据
or
lpncsp = (LPRECT) lParam; //指向新的窗口坐标
参数
【fCalcValidRects】
价值【wParam中】.一个布尔值,如果为TRUE,则指定应用程序应指示客户区域的哪个部分包含有效信息。操作系统将有效信息复制到新客户区内的指定区域。此外,如果此参数为TRUE,则【lParam的】指向NCCALCSIZE_PARAMS结构。
如果此参数为FALSE,则应用程序不需要指示客户端区域的有效部分。此外,如果此参数为FALSE,则【lParam的】指向RECT 结构。
【This value causes the entire window to be redrawn.】
价值【lParam的】.
如果【wParam中】为TRUE,则【lParam的】指向NCCALCSIZE_PARAMS结构,其中包含应用程序可用于计算客户端矩形的新大小和位置的信息。
如果【wParam中】为FALSE,【lParam的】指向RECT 结构,其中包含已移动或调整大小的窗口的新坐标。这相当于NCCALCSIZE_PARAMS NCCALCSIZE_PARAMS结构的rgrc [0].
返回值
如果【fCalcValidRects】参数为FALSE,则应用程序应返回零。
如果【fCalcValidRects】为TRUE,则应用程序可以返回零或以下值的有效组合:
值 | 含义 | ||||
WVR_ALIGNTOP, WVR_ALIGNLEFT, WVR_ALIGNBOTTOM, WVR_ALIGNRIGHT | |||||
组合使用的这些值指定窗口的客户端区域将相对于窗口的新位置适当地保留和对齐。例如,要将客户端区域对齐到左下角,返回WVR_ALIGNLEFT和WVR_ALIGNTOP值。 | |||||
WVR_HREDRAW, WVR_VREDRAW | |||||
与任何其他值组合使用的这些值,如果客户端矩形水平或垂直更改大小,则会使窗口完全重绘。这些值类似于CS_HREDRAW和CS_VREDRAW类样式。 | |||||
WVR_REDRAW | |||||
此值将导致整个窗口重绘。它是WVR_HREDRAW和WVR_VREDRAW值的组合。 | |||||
WVR_VALIDRECTS | |||||
该值表示,从WM_NCCALCSIZE返回时,NCCALCSIZE_PARAMS结构的rgrc和Windows combines these rectangles to calculate the area of the window to be preserved.成员指定的矩形分别包含有效的源和目标区域矩形。Windows组合这些矩形以计算要保留的窗口的面积。Windows复制源矩形内的窗口图像的任何部分,并将图像剪切到目标矩形。两个矩形都是父对照或屏幕相对坐标。 | |||||
此返回值允许应用程序实现更精细的客户端区域保留策略,例如居中或保留客户区域的子集。 |
如果【fCalcValidRects】为TRUE并且应用程序返回零,旧的客户端区域将保留并与新客户区域的左上角对齐。
默认动作
根据是否指定了CS_HREDRAW或CS_VREDRAW类样式,可以重新绘制窗口。这是通过DefWindowProc函数(除了上表中描述的通常的客户端矩形计算)的默认的向后兼容处理。
也可以看看
DefWindowProc, MoveWindow, SetWindowPos, NCCALCSIZE_PARAMS, RECT