WM_NCCALCSIZE消息在需要计算窗口客户区的大小和位置时发送。通过处理这个消息,应用程序可以在窗口大小或位置改变时控制客户区的内容。
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_NCCALCSIZE
WPARAM wParam, // validation flag (BOOL)
LPARAM lParam // data (LPNCCALCSIZE_PARAMS or LPRECT)
);
HWND hwnd, // handle to window
UINT uMsg, // WM_NCCALCSIZE
WPARAM wParam, // validation flag (BOOL)
LPARAM lParam // data (LPNCCALCSIZE_PARAMS or LPRECT)
);
参数
·wParam
wParam为TRUE时,说明应用程序应该指定客户区哪一部分包含有效的信息。
系统把有效信息拷贝到新客户区内的指定区域。
wParam为FALSE时,应用程序无需指定客户区的有效部分。
·lParam
wParam为TRUE时,lParam指向一个NCCALCSIZE_PARAMS结构。该结构包含应用程序可用于计算客户区新的大小和位置的信息。
wParam为FALSE时,lParam指向一个RECT结构。进入时,该结构包含了建议的窗口矩形。返回时,该结构应该包含窗口客户区的屏幕坐标。
·返回值
如果wParam为FALSE,应该返回0。
如果wParam为TRUE,应该返回0,或下列值的组合。
·WVR_ALIGNTOP, WVR_ALIGNLEFT,WVR_ALIGNBOTTOM
这些值,用于表示窗口客户区应该相对窗口的新位置适当地对齐。比如,要把客户区对齐到左下角,返回 WVR_ALIGNLEFT|WVR_ALIGNBOTTOM。
·WVR_HREDRAW, WVR_VREDRAW
当客户区矩形水平或垂直改变大小时,窗口要完全重画。它们类似于CS_HREDRAW和CS_VREDRAW。
·WVR_REDRAW
导致整个窗口重画。相当于WVR_HREDRAW|WVR_VREDRAW。
·WVR_VALIDRECTS
此值表示函数返回时,NCCALCSIZE_PARAMS结构中rgrc[1]和rgrc[2]成员分别包含有效的目标区域矩形和源区域矩形。系统把这些矩形组合起来以计算要保留的窗口区域。系统拷贝源矩形中的窗口图象,然后剪切放入目标矩形中。两个矩形都用相对父窗口的坐标或屏幕坐标来表示。
这个返回值允许应用程序实现更加精细的客户区保留策略,如果中心对齐或保留客户区的一个子集。
如果wParam为TRUE而程序返回0,原有的客户区被保留并对齐到新客户区的左上角。
注释
窗口根据是否指定了CS_HREDRAW或CS_VREDRAW类风格而可能被重画。这是DefWindowProc函数对此消息的默认的,为保持后向兼容而做的处理(以及通常的客户区矩形计算)。
NCCALCSIZE_PARAMS
NCCALCSIZE_PARAMS结构包含了应用程序在处理WM_NCCALCSIZE消息时可用的信息,以计算窗口客户区的大小、位置,以及有效内容。
typedef struct _NCCALCSIZE_PARAMS NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
成员
·rgrc
矩形数组。
第一个矩形包含窗口在移动或改变大小后的新坐标,也就是说,它是建议的新窗口坐标。
第二个矩形包含了窗口在移动或改变大小前的坐标。
第三个包含了窗口移动或改变大小前的客户区坐标。
如果该窗口是子窗口,这些坐标相对于父窗口的客户区。如果窗口是顶层窗口,坐标相对于屏幕原点。
第一个矩形包含窗口在移动或改变大小后的新坐标,也就是说,它是建议的新窗口坐标。
第二个矩形包含了窗口在移动或改变大小前的坐标。
第三个包含了窗口移动或改变大小前的客户区坐标。
如果该窗口是子窗口,这些坐标相对于父窗口的客户区。如果窗口是顶层窗口,坐标相对于屏幕原点。
·lppos
指向WINDOWPOS结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。