何时(以及如何)布局 Win32 窗口的子窗口以响应调整大小?

Posted

技术标签:

【中文标题】何时(以及如何)布局 Win32 窗口的子窗口以响应调整大小?【英文标题】:When (and how) to lay out the children of a Win32 window in response to a resize? 【发布时间】:2012-06-03 19:23:48 【问题描述】:

调整窗口大小时,Windows 会发送几条消息:

WM_GETMINMAXINFO WM_ENTERSIZEMOVE WM_EXITSIZEMOVE WM_NCCALCSIZE WM_SIZING WM_SIZE WM_WINDOWPOSCHANGING WM_WINDOWPOSCHANGED

可能还有更多。

如果我想在调整窗口大小时重新定位子级,在哪里以及如何这样做? 我正在寻找“最好”的方法——即具有最少陷阱和闪烁最少的方法。

我的当前方法是使用DeferWindowPosWM_NCCALCSIZE中执行所有重新定位。 但是,我也尝试过在 WM_WINDOWPOSCHANGED... 中处理它...但无论我在哪里处理它,似乎都有总是至少 一个“时刻”当窗口以中间状态绘制时,窗口的大小已更改,但其内容尚未调整大小。

另一个我想避免的影响:移动一个孩子它已经移动了。我不希望用户看到控件向下滑动然后返回因为我的更改——它应该尽可能少的瞬态效果。

我这样做正确吗?有没有更好的地方可以布置窗户的孩子?

【问题讨论】:

当只有父级的位置改变时,调整子窗口的大小没有多大意义。 WM_SIZE 提供最少的闪烁。 @HansPassant:对,我没有那样做。 WM_WINDOWPOSCHANGED 实际上也是尺寸通知。 (虽然修正了一个错字。)感谢您提供有关 WM_SIZE 的信息。 【参考方案1】:

您应该在 WM_SIZE 消息中重新定位窗口,因为这是窗口在完成任务之前收到的最后一个消息...要重新定位窗口,您可以使用 MoveWindow

【讨论】:

以上是关于何时(以及如何)布局 Win32 窗口的子窗口以响应调整大小?的主要内容,如果未能解决你的问题,请参考以下文章

.NET/Win32 - 检测属于另一个应用程序的窗口何时获得焦点的事件

如何更改 win32 窗口上的文本?

检测窗口何时停止移动?

win32 窗口阻止键盘布局更改

python中获取子窗口的句柄

python win32gui 查找子窗口