如何在 Delphi 12 中通过代码更改默认样式和系统颜色

欢迎加入全网最大Delphi 技术交流群 682628230
在 Delphi 中,样式编辑器允许用户在“字体”、“颜色”和“系统颜色”三个部分中分别调整预定义的颜色。当启用主题时,我们希望能够通过代码实现类似的更改,例如将 clHighlight 设置为 clRed,但直接赋值似乎并不起作用。

问题描述

  • Delphi 的样式编辑器可以更改样式中的颜色,但这些更改是通过资源文件实现的,编译后会嵌入到可执行文件中。
  • 在运行时,应用程序只能读取特定的样式,而无法直接修改样式中的颜色。
  • clHighlight 等系统颜色并不是实际的颜色值,而是告诉运行时库(RTL)从操作系统获取实际颜色的标志,因此无法直接将其重定向为其他颜色值。

解决方案

经过研究,发现可以通过扩展 TCustomStyle 类来实现对系统颜色的动态修改。具体方法如下:
  1. 创建一个辅助类:通过为 TCustomStyle 添加一个辅助类,可以访问和修改其内部的 SysColors 数组。
  2. 实现代码
    delphi复制
    unit StyleColor;
    
    interface
    
    uses Vcl.Themes, Vcl.Styles, Vcl.StyleAPI;
    
    type
      TStyleHelper = class helper for TCustomStyle
      public
        procedure DoSetSystemColor(SysColor: TColor; Color: TColor);
      end;
    
    implementation
    
    { TStyleHelper }
    
    procedure TStyleHelper.DoSetSystemColor(SysColor: TColor; Color: TColor);
    begin
      TseStyle(FSource).SysColors[SysColor] := Color;
    end;
    
    end.
  3. 使用方法: 在运行时,通过以下代码可以更改系统颜色:
    delphi复制
    if TStyleManager.ActiveStyle is TCustomStyle then
    begin
      TCustomStyle(TStyleManager.ActiveStyle).DoSetSystemColor(clHighlight, clRed);
    end;
    这段代码会将所有 clHighlight 的颜色更改为红色。

 

虽然 Delphi 的样式系统限制了直接修改样式文件中的颜色,但通过扩展 TCustomStyle,我们可以在运行时动态更改系统颜色。这种方法利用了 Delphi 样式系统的灵活性,为开发者提供了更多的自定义选项。
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享