2011-12-22 4 views
19

Я использую новую систему стилей VCL в Delphi XE2. Он отлично работает, но я хочу отключить его для конкретной формы, на которой есть несколько изображений (всплеск/форма). Проблема в том, что я не могу найти свойство формы, которое связывает его с определенным стилем, и поэтому не может отключить его только для этой формы. Кажется, что существует только глобальный класс TStyleManager, который кажется статическим.Как отключить стили VCL в Delphi

Имея это в виду, это единственный способ достичь этого, позвонив по номеру TStyleManager.TrySetStyle('Windows'), покажите форму и затем верните ее в исходный стиль, когда форма закрыта?

+0

AFAICT, с новыми 'Styles' это все или ничего. IOW, если вы используете 'Styles', они применяются к каждой отдельной форме в вашем приложении, и нет возможности выборочно включать/отключать их на основе каждой формы. –

ответ

24

VCL Styles применяют скин ко всем приложениям VCL, но вы можете отключить стили VCL для определенного класса управления. Поэтому, если вы хотите отключить стили VCL для определенной формы, вы можете использовать функцию RegisterStyleHook, передающую тип формы и класс TStyleHook, который является пустым классом класса hook.

Эта строка кода отключит Стили VCL во всех формах типа TFormChild:

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; 

и теперь вы можете отключить стили VCL на TButton этой формы, а с этим кодом

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

Если вы хотите получить больше информации о использовании TStyleHook класса, проверьте статью Exploring Delphi XE2 – VCL Styles Part II.

+0

Просто дополнительное примечание: вышеупомянутый ответ охватывает только элементы управления, унаследованные от класса «TWinControl», а также некоторые элементы управления потребуют создания пользовательского класса TStyle Hook для игнорирования текущего стиля. – RRUZ

+3

Я знал, что у вас будет решение этой проблемы, Родриго :) Вот почему я написал комментарий вместо ответа. Хорошая работа - +1. –

+0

Хороший ход, отлично работает, кроме TPanel. Интерполятор для TButton, как в примере, работает, но интерполированный TPanel, по-видимому, по-прежнему окрашивается с использованием стиля AFAICT. Любая идея почему? –

-2

Самый простой способ - поместить всплеск в отдельную DLL. Таким образом, стайлер не будет трогать его.

+1

Вряд ли легко. Затем вам также нужно проверить, существует ли DLL, если строка proc находится, а также добавить дополнительную работу к установщику. Наверняка его легче добавить X количество источников и сделать с ним :) –

+0

Почему downvote? Кажется вполне разумным для меня, если это решает проблему! –

+0

Вероятно, подавляющее большинство голосов связано с фразой «Самый простой способ». Это правильный ответ, но окончательно не «легкий путь». – Ampere