背景:我有一个顶级窗口,其中定义了一个区域(使用SetWindowRgn()
创建),并且我有一个子元素,通过SetWindowPos()
移动,使其一些像素与父窗口的裁剪部分重叠。
结果:这些像素变成了完全不透明、完全白色的像素,而不是保持完全透明(因为它在其父窗口的区域之外)。这并不是子窗口在不应该绘制时被绘制了,因为无论子窗口看起来如何,这些冒犯的像素都是白色的。
下面,小的橙色子窗口已经沿着父窗口的边缘移动了一些。这只会发生在具有透明窗口区域的边缘上(因此白色像素始终限制在父窗口的最大矩形内)。
如果隐藏然后显示父窗口,情况就会得到纠正(仅使其无效并强制重新绘制不会清除白色像素)。
这在Vista和7上都被观察到。如果我禁用桌面窗口管理器(DWM),这种行为就会消失。在某些情况下,更新图形驱动程序后也会消失。也许它与这个问题有关吗?:Vista live thumbnail issue with SetWindowRgn。我最初只是打算将其归档为一种罕见的错误,但它已经出现了足够多的次数,值得更多的审查。
还有其他人遇到过这个问题吗?DWM和窗口区域如何相互作用的任何见解?
此外,我知道我可以为每个应用程序禁用DWM,但这会在应用程序运行时禁用它,除了在启动和关闭时导致屏幕闪烁之外,这并不是一个更好的问题。