tor*_*rno 3 delphi combobox vcl-styles
我正在使用Delphi XE3.使用自Delphi XE2以来可用的自定义样式(例如Carbon)时,将鼠标移动到TComboBoxEx控件(MouseExit/Enter)的边框上时会出现可见的白色闪烁.
重现的步骤:创建一个新的VCL Forms应用程序,在表单上删除TComboBoxEx,选择例如项目选项中的Carbon - > Application\Appearance并启动应用程序
这是一个已知的问题/错误,是否已知任何解决方案?
谢谢
此边框闪烁问题不是使用Delphi VCL样式的产物.
(不使用VCL样式可以观察到同样的问题)
这里的罪魁祸首是桌面窗口管理器,它是
Windows视觉样式和主题的重要组成部分.
您之所以看到此问题而其他问题可能不是,原因是您在某些时候更改了默认的Windows主题(aero主题),或者您更改了所选主题的特定视觉效果属性.
您可能还有意或无意地禁用了桌面窗口管理器,因为它作为Windows服务运行.
更确切地说,如果启用桌面合成功能,问题就解决了.
此功能仅适用于Aero主题(默认),但不适用于基本或经典,有时它似乎可用,即使它不可用.
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主题上不会发生此问题.