Создание скинов 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
теперь поддерживает диалоги
Вы можете найти больше информации об этой функции в этом блоге.