带有VCL样式的TComboBoxEx:边框闪烁

时间:2013-07-08 11:56:11

标签: delphi combobox vcl-styles

我正在使用Delphi XE3。使用自Delphi XE2以来可用的自定义样式(例如Carbon)时,将鼠标移动到TComboBoxEx控件(MouseExit / Enter)的边框上时会出现可见的白色闪烁。

重现步骤:创建一个新的VCL表单应用程序,在表单上删除TComboBoxEx,选择例如项目选项中的碳 - > Application \ Appearance并启动应用程序

这是一个已知的问题/错误,是否已知任何解决方案?

谢谢

1 个答案:

答案 0 :(得分:5)

此边框闪烁问题不是使用Delphi VCL样式的产品。
(不使用VCL样式可以观察到同样的问题)

这里的罪魁祸首是Desktop Window Manager,它是Windows视觉风格和主题的重要组成部分。

您之所以看到此问题而其他问题可能不是,原因是您在某些时候更改了默认的Windows主题(aero主题),或者您更改了所选主题的特定视觉效果属性。

您可能也有意或无意地禁用了桌面窗口管理器,因为它作为Windows服务运行。

更确切地说,如果您启用桌面合成功能,问题就解决了。
此功能仅适用于 Aero 主题(默认),但不适用于基本经典,有时它看起来似乎是即使它没有,也可以使用。

Control Panel --> System --> Advanced System Settings --> Advanced --> Performance Settings --> Visual Effects

enter image description here


  

启用桌面合成后,不再绘制单个窗口   直接到屏幕或主显示设备,就像他们在   以前的Windows版本。相反,他们的绘图被重定向到   视频内存中的屏幕外表面,然后呈现为   桌面图像并显示在显示屏上。

正如您可能已经猜到的那样,此功能的功能基本上是充当缓冲区,当这个选项关闭时,它以非常简洁的方式解释边界闪烁。

重要事实

桌面合成功能只有在当前主题为Aero主题且使用Windows Visual Styles时才会启用。(默认情况下,每个Aero主题都启用)

默认情况下,在Aero主题中启用了视觉样式,您可以通过确保在“性能设置”中启用Use Visual Styles on Windows功能来检查它是否已启用。当经典或基本主题生效时,桌面组合功能永远不会播放,无法启用。 (自Windows 8以来,经典主题已被弃用)

有时在Windows 7中,即使使用基本或经典主题,桌面合成功能也可以在性能选项中显示,但不要被愚弄,这是一个内部错误。

重现此错误的步骤:

  1. 以默认Windows Aero主题开始
  2. 如上所述进入性能设置
  3. 从列表中取消选中桌面合成
  4. 鼠标悬停在TComboBoxEx的边框上,它现在应该闪烁为 你进入/离开。

  5. 但如果取消选中Use Visual Styles on Windows复选框会怎样?为什么这会解决闪烁问题?

    这将导致桌面窗口管理器(DWM)为所有Windows控件一起禁用所有主题。这意味着将使用较旧的渲染样式绘制控件,而不是使用较新的Aero渲染样式。

    您可以使用以下方法SetWindowTheme(Handle, nil, nil)

    关闭单个控件的视觉样式而不将其全局关闭

    这也是禁用视觉样式时解决TComboBoxEx边框闪烁问题的原因。 还值得一提的是,自Windows 8以来,您无法再禁用视觉样式,因为正如我所说,经典主题已被弃用。


    关于解决方案,我认为你没有太多的选择。考虑到修改 Windows主题的视觉效果给用户留下了多少自由,这种事情必然会发生。至少您可以确定在默认的Windows主题上不会发生此问题。