我正在使用德尔福 XE3。当使用自 Delphi XE2 以来可用的自定义样式(例如 Carbon)时,将鼠标移动到 TComboBoxEx 控件(MouseExit/Enter)的边框上时会出现可见的白色闪烁。
重现步骤:创建一个新的 VCL Forms 应用程序,在表单上放置一个 TComboBoxEx,在项目选项中选择例如 Carbon --> Application\Appearance 并启动应用程序
这是一个已知的问题/错误,是否有任何已知的解决方案?
谢谢
我正在使用德尔福 XE3。当使用自 Delphi XE2 以来可用的自定义样式(例如 Carbon)时,将鼠标移动到 TComboBoxEx 控件(MouseExit/Enter)的边框上时会出现可见的白色闪烁。
重现步骤:创建一个新的 VCL Forms 应用程序,在表单上放置一个 TComboBoxEx,在项目选项中选择例如 Carbon --> Application\Appearance 并启动应用程序
这是一个已知的问题/错误,是否有任何已知的解决方案?
谢谢
这个边框闪烁问题不是使用 Delphi VCL Styles 的产物。
(不使用 VCL 样式也可以观察到同样的问题)
罪魁祸首是桌面窗口管理器,它是
Windows 视觉样式和主题的重要组成部分。
您看到此问题而其他问题可能没有的原因是您在某些时候更改了默认的 Windows 主题(aero 主题),或者您更改了所选主题的特定视觉效果属性。
您可能还有意或无意地禁用了桌面窗口管理器,因为它作为 Windows 服务运行。
更准确地说,如果您启用桌面合成功能,问题就会得到解决。
此功能仅在Aero主题(默认)中可用,但在Basic或Classic中不可用,但有时即使它不可用,它也可能看起来可用。
Control Panel --> System --> Advanced System Settings --> Advanced --> Performance Settings --> Visual Effects
启用桌面合成后,各个窗口不再像在以前版本的 Windows 中那样直接绘制到屏幕或主显示设备上。相反,他们的绘图被重定向到视频内存中的屏幕外表面,然后渲染成桌面图像并呈现在显示器上。
正如您可能已经猜到的那样,此功能的功能基本上是充当缓冲区
,以非常简洁的方式解释关闭此选项时的边框闪烁。
仅当您当前的主题是 Aero 主题并使用Windows 视觉样式时,才能启用桌面合成功能。(默认情况下,每个 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 主题不会发生此问题。