如何避免GUI调整大小的瞬态更新?

时间:2012-07-05 22:37:48

标签: windows winapi layout window-managers window-resize

如果半快速地拖动窗口的顶部或左侧边框,您应该注意到窗口的相对边缘会振动 - 它会被拖动,但随后会重新调整以增加尺寸。

当你有动态调整大小的项目时,问题会更加严重 - 然后一大堆你的控件开始滑动并在屏幕上调整大小,非常明显。

有没有办法防止这些瞬态效应?

e.g。也许响应WM_SIZE之类的消息的特定序列可以抑制这种情况?我不知道。

(它似乎发生在我见过的每个框架中,甚至是简单的Win32。只需打开资源管理器或其他东西并拖动它的顶部或左边缘,你就会看到我的意思。)

2 个答案:

答案 0 :(得分:1)

回复WM_WINDOWPOSCHANGING条消息,并在SWP_NOCOPYBITS结构的flags成员中设置WINDOWPOS标记。

答案 1 :(得分:0)

2018年更新。 SO上经常提到的WM_WINDOWPOSCHANGING和相关的WM_NCCALCSIZE技巧在XP / Vista / 7上效果很好,但在Win8 / 10上已经不够用了,因为Aero增加了新的调整大小问题,掩盖了或恶化了,较老的问题。

Win8 / 10问题很难解决,因为DWM.exe中发生了不必要的像素复制,DWM.exe是另一个过程,它会合成系统中所有应用程序的像素。

请参阅此问答,以获取正在发生的情况的说明,并带有一些WM_NCCALCSIZE的示例代码来解决XP / Vista / 7层(在Win8 / 10中仍然存在)的问题,以及8/10的部分解决方案。

How to smooth ugly jitter/flicker/jumping when resizing windows, especially dragging left/top border (Win 7-10; bg, bitblt and DWM)?