【问题标题】:When (and how) to lay out the children of a Win32 window in response to a resize?何时(以及如何)布局 Win32 窗口的子窗口以响应调整大小?
【发布时间】: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 的信息。

标签: winapi visual-c++ window-resize


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2010-12-12
    • 2022-08-18
    • 2011-03-17
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多