为什么不为最大化的 MDIChild 调用 ResizeBegin?

Why doesn't ResizeBegin get called for a maximized MDIChild?

在 Winforms 中,如果 MDI child window 最大化,它不会接收 ResizeBegin(或 ResizeEnd)事件。它确实接收到 Resize 事件——为什么会有区别?如果 child 没有最大化,它会得到 ResizeBegin/End 事件。有解决这个问题的好方法吗?有很多丑陋的方法:例如直接从 MDI 容器 ResizeBegin 事件调用 child。

当用户开始和停止调整 window 大小时会生成 ResizeBegin/End 事件。由 Windows 本身内部的模式循环实现,当用户移动鼠标光标时,它会保持 window 边缘跟随鼠标光标。当他单击 window 边时 ResizeBegin,当他释放鼠标按钮时 ResizeEnd。

很明显,当您在代码中更改 MDI 子 window 的 Size 或 ClientSize 属性 时,没有任何用户参与。所以没有 Begin 或 End,只有 Resize 事件。并且只有 一个 调整大小事件触发器,没有像用户使用鼠标调整大小时那样的恒定序列。这也解释了为什么 Begin/End 很重要,如果您在 Resize 事件处理程序中做了很多工作,那么您将陷入 UI 的困境。常见于自动布局,可见工件不漂亮。

如果您确实需要,那么您可以自己生成事件。之前调用 OnResizeBegin(),更改 window 的 Client/Size 属性 值后调用 OnResizeEnd()。该代码需要存在于您调整大小的 window 中以触发正确的事件。顺便说一句,你不太可能这样做。请注意,MDI 会自动调整最大化的 MDI 子项 window 的大小,当您激活另一个子项时,它当然不能再最大化。你不能用 OnResizeBegin/End() 调用包装它。