使用VCL样式为TOpenDialog和TOpenPictureDialog设置外观

时间:2012-12-05 09:19:13

标签: delphi vcl-styles

是否可以使用VCL样式为OpenDialog和TOpenPictureDialog设置外观?

2 个答案:

答案 0 :(得分:5)

简单的回答是无,目前采用Delphi XE2 XE3或不可能直接对VCL样式适用于非VCL的形式(或以一个VCL应用之外创建形式)。

现在很长的答案,技术上可以将Vcl样式应用于这些对话框,但这需要大量的工作(相信我需要做很多工作)。

的关键是使用WH_CBT钩,检测HCBT_CREATEWND代码,然后检查是否类窗口的是#32770(类为一个对话框。)从这里可以使用GWL_WNDPROC索引替换窗口过程

这是一个简单的部分,现在您可以控制Windows对话框发送的消息 您必须遍历子控件并使用。再次替换窗口过程 GWL_WNDPROC索引。这可以为Windows对话框中使用的每个控件创建Wrapper类(这是一项艰苦的工作)(按钮,syslistview32,Combobox等)

这是syslistview32 windows类的Wrapper类的定义示例。

  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控件定义的现有VCL样式钩子,就像这样的TListView

TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook);

我已经完成了上述部分任务,但尚未完成,因此这类项目需要大量时间。

enter image description here

答案 1 :(得分:4)

对于任何感兴趣的VCL Styles Utils Project现在支持对话

enter image description here

您可以在this blog post上找到有关此功能的更多信息。