【发布时间】: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的信息。
标签: winapi visual-c++ window-resize