【问题标题】:How to disable VCL styles in Delphi如何在 Delphi 中禁用 VCL 样式
【发布时间】:2012-01-25 18:58:41
【问题描述】:

我在 Delphi XE2 中使用新的 VCL 样式系统。它工作得很好,但我希望为上面有许多图像的特定表单禁用它(启动/关于表单)。问题是我似乎无法找到将其与特定样式相关联的表单属性,因此不能仅针对该表单禁用它。似乎只有全局 TStyleManager 类似乎是静态的。

考虑到这一点,实现这一点的唯一方法是调用TStyleManager.TrySetStyle('Windows'),显示表单,然后在表单关闭时将其设置回原始样式?

【问题讨论】:

  • AFAICT,有了新的Styles,要么全有,要么全无。 IOW,如果您使用 Styles,它们将应用于您应用中的每个表单,并且无法根据每个表单选择性地启用/禁用它们。

标签: delphi delphi-xe2 skinning vcl-styles


【解决方案1】:

VCL 样式将皮肤应用于所有 VCL 应用程序,但您可以禁用特定控件类的 VCL 样式。因此,如果您想禁用特定表单的 VCL 样式,您可以使用 RegisterStyleHook 函数传递表单的类型和 TStyleHook 类,这是一个空的样式挂钩类。

这行代码将禁用 TFormChild 类型的所有表单中的 VCL 样式:

TStyleManager.Engine.RegisterStyleHook(TFormChild, TStyleHook);

现在,如果您运行此代码,表单的所有控件,TFormChild 仍将使用 VCL 样式进行绘制,因此要解决此问题,您必须使用这样的技巧禁用表单所有控件的默认样式挂钩

unit uChild;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TButton   = class(Vcl.StdCtrls.TButton); //This declaration is only for disabling the TButton of this form
  TFormChild = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

现在您也可以使用此代码禁用此表单的 TButton 的 VCL 样式

TStyleManager.Engine.RegisterStyleHook(uChild.TButton, TStyleHook);

如果您想了解有关 TStyleHook 类使用的更多信息,请查看文章Exploring Delphi XE2 – VCL Styles Part II

【讨论】:

  • 只是一个额外的注意:上面的答案只涵盖了TWinControl类继承的控件,还有一些控件需要你创建一个自定义的TStyle Hook类来忽略当前的样式。跨度>
  • 我知道你会有解决这个问题的办法,罗德里戈 :) 这就是我发表评论而不是答案的原因。干得好 - +1。
  • @AlanClark 你让我搜索'Interpolator'是什么,直到我意识到你的意思是一个拦截器类......至少我是这样了解这个概念并听说过它的:)
  • @Marjan - 然而,它最初是在 1998 年 5 月的 delphi 杂志上创造的“插入器类”。我想是时候将它缩写为 IC,即“intersomething class”的简写。
  • @Sertac:感谢您的历史。不知道那个。缩写对我来说听起来不错:)
【解决方案2】:

最简单的方法是将启动表单放在单独的 DLL 中。这样造型器就不会碰它。

【讨论】:

  • 不容易。然后,您还必须检查 DLL 是否存在,proc 的排列是否一致,并且还必须为安装程序添加额外的工作。当然更容易添加 X 数量的源代码并完成它:)
  • 为什么要投反对票?如果这能解决问题,对我来说似乎完全合理!
  • 投反对票可能是因为“最简单的方法”短语。这是有效的答案,但绝对不是“简单的方法”。
【解决方案3】:

从 Splash Form 的 StyleElements 属性中删除(取消选中)seClient 选项对我有用(Delphi XE10)。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2012-02-26
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2012-04-17
    • 2015-01-09
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多