何时(以及如何)布局 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可能还有更多。
如果我想在调整窗口大小时重新定位子级,在哪里以及如何这样做? 我正在寻找“最好”的方法——即具有最少陷阱和闪烁最少的方法。
我的当前方法是使用DeferWindowPos
在WM_NCCALCSIZE
中执行所有重新定位。
但是,我也尝试过在 WM_WINDOWPOSCHANGED
... 中处理它...但无论我在哪里处理它,似乎都有总是至少 一个“时刻”当窗口以中间状态绘制时,窗口的大小已更改,但其内容尚未调整大小。
另一个我也想避免的影响:移动一个孩子在它已经移动了。我不希望用户看到控件向下滑动然后返回因为我的更改——它应该尽可能少的瞬态效果。
我这样做正确吗?有没有更好的地方可以布置窗户的孩子?
【问题讨论】:
当只有父级的位置改变时,调整子窗口的大小没有多大意义。 WM_SIZE 提供最少的闪烁。 @HansPassant:对,我没有那样做。WM_WINDOWPOSCHANGED
实际上也是尺寸通知。 (虽然修正了一个错字。)感谢您提供有关 WM_SIZE
的信息。
【参考方案1】:
您应该在 WM_SIZE 消息中重新定位窗口,因为这是窗口在完成任务之前收到的最后一个消息...要重新定位窗口,您可以使用 MoveWindow
【讨论】:
以上是关于何时(以及如何)布局 Win32 窗口的子窗口以响应调整大小?的主要内容,如果未能解决你的问题,请参考以下文章