每当我移动窗口并同时调整大小时,我的窗口似乎都会闪烁.这通常发生在从窗口左侧进行尺寸调整时.
为什么会发生这种闪烁?换句话说,当您重新定位窗口时,操作系统在做什么?
注意:从右侧调整大小时,我不会遇到闪烁,这意味着窗口不一定会移动其原点X和Y.
在Windows下调整窗口大小涉及在OS和窗口处理程序之间发送的几条消息(用于注册窗口类的WNDCLASSEX结构的lpfnWndProc成员).您可以使用一些消息监视工具自己发现它们.Visual Studio附带的Spy ++就是这样一个工具.
一个有趣的消息是WM_NCCALCSIZE:在窗口大小调整期间调用的此消息可以生成两个矩形(当设置WVR_VALIDRECTS标志时):source和target指定旧窗口的客户区域的哪些内容可以在新窗口的位置"重用".默认情况下,假设左上角是一个枢轴:
如果它与重绘期间定位视觉效果的方式不对应,则此默认复制可能会导致闪烁.例如,从左边框或上边框调整大小后,相对于右边框或下边框显示的所有内容都会放错位置:这些对象会在调整大小后不必要地移动,留下奇怪的新旧内容,因为只有非复制的像素将被重新粉刷.如果你试图用InvalidateRect来治愈这个混乱,比如WM_SIZE,你会得到闪烁(事情错位的时间间隔很短,但它仍然存在).
禁用此行为的最简单方法是为窗口设置CS_HREDRAW和CS_VREDRAW 类样式.