gpt4 book ai didi

c++ - 从左侧调整大小时窗口闪烁

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:46 25 4
gpt4 key购买 nike

每当我同时移动和调整窗口大小时,我的窗口似乎都在闪烁。这通常发生在从窗口左侧调整大小时。

为什么会出现这种闪烁?换句话说,当您重新定位窗口时,操作系统在做什么?

注意:从右侧调整大小时我没有遇到闪烁,这意味着窗口不一定移动其原点 X 和 Y。

最佳答案

在 Windows 下调整窗口大小涉及操作系统和窗口处理程序之间发送的多个消息(WNDCLASSEX 结构的 lpfnWndProc 成员用于 register 窗口的类)。您可以使用一些消息监控工具自行发现它们。 Spy++ Visual Studio 附带的工具就是这样一种工具。

一个有趣的消息是 WM_NCCALCSIZE :在窗口调整大小时调用的此消息可以生成两个矩形(当设置 WVR_VALIDRECTS 标志时):源和目标指定旧窗口客户区的哪些内容可以在新窗口的位置“重用”。默认情况下,假定左上角是一个枢轴:

  • 调整左边框或上边框的大小会导致复制旧窗口的内容以保留轴心;
  • 调整右下边框的大小不会复制任何内容,因为窗口的左上角没有移动。

如果此默认复制与您在重绘期间放置视觉对象的方式不对应,则可能会导致闪烁。例如,在从左边框或上边框调整大小后,相对于右边框或底边框显示的所有内容都将放错位置:这些对象将不必要地移动,在调整大小后留下新旧事物的奇怪混合,因为只有未复制的像素将重新粉刷。如果您尝试使用 InvalidateRect 来解决这个问题例如,在 WM_SIZE 期间,您会看到闪烁(东西放错地方的时间间隔很短,但它仍然存在)。

禁用此行为的最简单方法是设置 CS_HREDRAW 和 CS_VREDRAW Class Styles为你的 window 。

关于c++ - 从左侧调整大小时窗口闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com