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

use*_*359 3 delphi vcl-styles

是否可以使用VCL syles为TOpenDialog和TOpenPictureDialog设置外观?

RRU*_*RUZ 5

简短的答案是否,目前使用Delphi XE2或XE3不可能直接将Vcl样式应用于非VCL表单(或在VCL应用程序之外创建的表单).

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

关键是使用WH_CBT Hook,检测HCBT_CREATEWND代码然后检查窗口#32770的类是否是(对话框的类).从这里你可以使用带索引的函数替换窗口过程.SetWindowLongGWL_WNDPROC

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

这是syslistview32windows类的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;
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用已经为Vcl控件定义的现有VCL样式挂钩(如TListView)

TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook);
Run Code Online (Sandbox Code Playgroud)

我已经完成了上面描述的部分任务,但还没有完成,因为这种项目需要很多时间.

在此输入图像描述