Создание скинов TOpenDialog и TOpenPictureDialog со стилями VCL

Можно ли скинуть TOpenDialog и TOpenPictureDialog с помощью VCL-файлов?

2 ответа

Краткий ответ - Нет, в настоящее время использование Delphi XE2 или XE3 невозможно, напрямую применить стили Vcl к форме, отличной от VCL (или к формам, созданным вне приложения VCL).

Теперь длинный ответ - технически возможно применить стили Vcl к подобным диалогам, но это требует большой работы (поверьте мне, это большая работа).

Ключ использует хук WH_CBT, обнаруживая HCBT_CREATEWND код, а затем проверка, если класс окна #32770 (класс для диалогового окна.) отсюда вы можете заменить оконную процедуру, используя SetWindowLong функция с GWL_WNDPROC индекс.

Это была простая часть, теперь, когда у вас есть контроль над сообщениями, отправляемыми диалоговым окном Windows, вы должны перебрать дочерние элементы управления и снова заменить оконную процедуру, используя индекс GWL_WNDPROC. Это можно сделать, создав класс Wrapper (это тяжелая работа) для каждого элемента управления, используемого в диалоговом окне Windows (кнопка, syslistview32, Combobox и т. Д.)

Это образец определения для класса Wrapper для syslistview32 класс окон.

  TListViewWnd = class(TCustomListView)
  private
    FNewWndProc  : Pointer;
    FOrgWndProc  : Pointer;
    Fhwnd: THandle;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
    procedure WndProc(var Message: TMessage); override;
  public
    constructor Create(hwnd: THandle);
    destructor  Destroy;override;
  end;

Наконец, вы можете использовать уже существующие хуки VCL Styles, определенные для элементов управления Vcl, например, TListView.

TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook);

Я уже выполнил часть задач, описанных выше, но еще не закончен, из-за чего этот вид проекта требует много времени.

Для любого заинтересованного VCL Styles Utils Project теперь поддерживает диалоги

введите описание изображения здесь

Вы можете найти больше информации об этой функции в этом блоге.

Другие вопросы по тегам