我曾经在我的 Win7 系统上注意到一个问题,认为这是一个 DWM 错误,因为它在重新启动后得到了修复。但现在我意识到它正在其他人的系统上发生(作为默认行为),这也是 Surface Pro 上的正常行为。
如何重现问题:使用 GDI 实现一个基本的套索系统。定义一个由鼠标控制的矩形,当矩形发生变化时,使旧的和新的无效(或使两个矩形的并集无效,无论是作为新矩形还是复杂区域,都无所谓,“错误”无论如何仍然显示)。
期间wm_paint
,您只需擦除背景并绘制矩形(它必须是矩形轮廓,如果它是填充矩形,问题将不可见)。如果你想确定这不是一个闪烁的问题,你可以做双缓冲(相信我不是)。
所以你会看到,如果你有一个像我这样的系统(桌面 Win7 带有 geforce,aero on),是一个普通的套索系统,没有比显示器自己的重影。在其他系统上(如 Surface Pro,定义一个完全已知的系统),您会看到,当您向外扩展套索时,套索的边界消失了。有点像 LCD 重影,但更明显。
现在,不要使套索的矩形无效,而是尝试使整个窗口无效。在那里,不再有重影。
我发现并不是“修复”它的失效,而是 GDI 访问。您也可以使整个矩形无效,但只绘制套索的区域,仍然重影。但是,如果您绘制套索区域并在窗口的每个角上绘制一个小像素,就不会再出现重影了。
DWM 中肯定有一些东西,可能从 1.1 版开始,它使用了最后一次 GDI 访问的边界框的某种缓存,并且出于某种奇怪的原因,最后一个边界框内的内容将立即出现在屏幕上,而新的部分将至少延迟 1 帧。
这非常糟糕,因为它破坏了每个人都使用的非常基本的窗口失效,而且我还没有找到任何方法来修复它(当然,除了使整个窗口失效,但这很愚蠢,而且这是一个问题会影响整个 GDI,因此您在任何地方的视觉效果都很差)。
同样,它最有可能在 DWM 1.1 中,我认为您无法在 Vista 中获得它,但我不确定。我也不知道为什么它在我的桌面上不这样做,可能它取决于显卡的驱动程序。
所以如果有人碰巧知道更多关于这...