Search code examples
delphidelphi-xe2skinningvcl-styles

How to disable VCL styles in Delphi


I am using the new VCL styles system in Delphi XE2. It works great, but I wish to disable it for a particular form that has a number of images on it (a splash/about form). Problem is I can't seem to find a property of the form that associates it with a particular style, and so can't disable it for that form only. There only seems to be the global TStyleManager class which appears to be static.

With this in mind, is the only way to achieve this to call TStyleManager.TrySetStyle('Windows'), show the form, and then set it back to the original style when the form is closed?


Solution

  • The VCL Styles apply a skin to all of the VCL application, but you can disable the VCL Styles for a particular control class. So if you want disable the VCL Styles for a particular form, you can use the RegisterStyleHook function passing the type of the form and the TStyleHook class which is a empty style hook class.

    This line of code will disable the VCL Styles in all the forms of the type TFormChild:

    TStyleManager.Engine.RegisterStyleHook(TFormChild, TStyleHook);
    

    Now, if you run this code all controls of the form, TFormChild will still painted with the VCL Styles, so to fix that you must disable the default Style hook for all the controls of the form using a trick like this

    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;
    

    and now you can disable the VCL Styles of the TButton of this form as well with this code

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

    If you want more information about the use of the TStyleHook Class, check the article Exploring Delphi XE2 – VCL Styles Part II.