我正在使用Delphi XE3。使用自Delphi XE2以来可用的自定义样式(例如Carbon)时,将鼠标移动到TComboBoxEx控件(MouseExit / Enter)的边框上时会出现可见的白色闪烁。
重现步骤:创建一个新的VCL表单应用程序,在表单上删除TComboBoxEx,选择例如项目选项中的碳 - > Application \ Appearance并启动应用程序
这是一个已知的问题/错误,是否已知任何解决方案?
谢谢
答案 0 :(得分:5)
此边框闪烁问题不是使用Delphi VCL样式的产品。
(不使用VCL样式可以观察到同样的问题)
这里的罪魁祸首是Desktop Window Manager,它是Windows视觉风格和主题的重要组成部分。
您之所以看到此问题而其他问题可能不是,原因是您在某些时候更改了默认的Windows主题(aero主题),或者您更改了所选主题的特定视觉效果属性。
您可能也有意或无意地禁用了桌面窗口管理器,因为它作为Windows服务运行。
更确切地说,如果您启用桌面合成功能,问题就解决了。
此功能仅适用于 Aero 主题(默认),但不适用于基本或经典,有时它看起来似乎是即使它没有,也可以使用。
Control Panel --> System --> Advanced System Settings --> Advanced --> Performance Settings --> Visual Effects
启用桌面合成后,不再绘制单个窗口 直接到屏幕或主显示设备,就像他们在 以前的Windows版本。相反,他们的绘图被重定向到 视频内存中的屏幕外表面,然后呈现为 桌面图像并显示在显示屏上。
正如您可能已经猜到的那样,此功能的功能基本上是充当缓冲区,当这个选项关闭时,它以非常简洁的方式解释边界闪烁。
桌面合成功能只有在当前主题为Aero主题且使用Windows Visual Styles时才会启用。(默认情况下,每个Aero主题都启用)
默认情况下,在Aero主题中启用了视觉样式,您可以通过确保在“性能设置”中启用Use Visual Styles on Windows
功能来检查它是否已启用。当经典或基本主题生效时,桌面组合功能永远不会播放,无法启用。 (自Windows 8以来,经典主题已被弃用)
有时在Windows 7中,即使使用基本或经典主题,桌面合成功能也可以在性能选项中显示,但不要被愚弄,这是一个内部错误。
重现此错误的步骤:
但如果取消选中Use Visual Styles on Windows
复选框会怎样?为什么这会解决闪烁问题?
这将导致桌面窗口管理器(DWM)为所有Windows控件一起禁用所有主题。这意味着将使用较旧的渲染样式绘制控件,而不是使用较新的Aero渲染样式。
您可以使用以下方法SetWindowTheme(Handle, nil, nil)
这也是禁用视觉样式时解决TComboBoxEx边框闪烁问题的原因。 还值得一提的是,自Windows 8以来,您无法再禁用视觉样式,因为正如我所说,经典主题已被弃用。
关于解决方案,我认为你没有太多的选择。考虑到修改 Windows主题的视觉效果给用户留下了多少自由,这种事情必然会发生。至少您可以确定在默认的Windows主题上不会发生此问题。