从左侧调整大小时,窗口会闪烁

Mat*_*ian 2 c c++ winapi

每当我移动窗口并同时调整大小时,我的窗口似乎都会闪烁.这通常发生在从窗口左侧进行尺寸调整时.

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

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

Non*_*ric 5

在Windows下调整窗口大小涉及在OS和窗口处理程序之间发送的几条消息(用于注册窗口类的WNDCLASSEX结构的lpfnWndProc成员).您可以使用一些消息监视工具自己发现它们.Visual Studio附带的Spy ++就是这样一个工具.

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

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

如果它与重绘期间定位视觉效果的方式不对应,则此默认复制可能会导致闪烁.例如,从左边框或上边框调整大小后,相对于右边框或下边框显示的所有内容都会放错位置:这些对象会在调整大小后不必要地移动,留下奇怪的新旧内容,因为只有非复制的像素将被重新粉刷.如果你试图用InvalidateRect来治愈这个混乱,比如WM_SIZE,你会得到闪烁(事情错位的时间间隔很短,但它仍然存在).

禁用此行为的最简单方法是为窗口设置CS_HREDRAW和CS_VREDRAW 类样式.