在Delphi中仅对一个VCL组件进行样式设置

7

我知道可以禁用组件的自定义样式,但是如何仅启用一个组件类的样式?比如只保留整个表单和其中所有组件的默认样式,而仅对TButton进行美化。就像这张图片上所示。

enter image description here


3
如果您只需要有样式的按钮,请尝试查找 TButton 组件的子类,它看起来不像通常的 TButton。 将 VCL 样式功能添加到项目中,然后对整个项目进行禁用(除了 TButton),这不是在项目中仅为一个按钮换肤的好方法。 - teran
在Delphi中,拥有样式功能却无法仅应用于部分应用程序,这看起来确实有些奇怪。 - Zelenov
@Zelenov 我并不觉得这很奇怪 - 它就是为此而设计的。只要你应用了一个主题,就假定你正在对整个应用进行皮肤设置。就我个人而言,我认为使用这些样式仅对某些控件进行皮肤设置是很奇怪的 - 考虑到它的工作机制。针对你的目的,我会创建自己的自定义按钮控件,这相当简单。 - Jerry Dodge
1个回答

13
大多数VCL控件在内部使用StyleServices全局函数来获取绘制控件的方法。因此,如果您不使用Vcl样式,则StyleServices返回一个实例,该实例使用Windows API函数来绘制主题化控件(UxTheme API)。因为没有办法只为单个类控件(至少是您自己绘制的控件)应用Vcl样式。
因此,唯一的选择是应用Vcl样式,然后禁用除您寻找的类型之外的所有控件。
您可以使用以下内容:
procedure DisableVclStyles(Control : TControl;const ClassToIgnore:string);
var
  i : Integer;
begin
  if Control=nil then
    Exit;

  if not Control.ClassNameIs(ClassToIgnore) then
   Control.StyleElements:=[];

  if Control is TWinControl then
    for i := 0 to TWinControl(Control).ControlCount-1 do
      DisableVclStyles(TWinControl(Control).Controls[i], ClassToIgnore);
end;

使用 Vcl 样式检查此表单

在这输入图片描述

现在调用上述方法后

DisableVclStyles(Self,'TButton');

输入图像描述

注意:使用 StyleElements 属性来启用或禁用 VCL 样式,无法与某些组件(如 TStringGrid、TBitBtn、TSpeedButton 等)一起工作。


我正在尝试在XE2中进行此操作,但TControl没有StyleElements属性。 - Jerry Dodge
没事了,我刚刚找到了你的另一个答案:http://stackoverflow.com/questions/16538890/how-to-color-the-background-of-a-tcombobox-with-vcl-styles-enabled - Jerry Dodge
如果我的组件在DataModule中创建,该怎么办? 当我在DataModule中放置“DisableVclStyles(Self,'TButton');”时,IDE会返回以下错误:不兼容的类型:“TControl”和“TDMRotinas”。 - Nickolas de Luca Alberton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接