3

是否可以使用 VCL 样式对 TOpenDialog 和 TOpenPictureDialog 进行蒙皮?

4

2 回答 2

5

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

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

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

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

这是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;

最后,您可以通过这种方式使用为 Vcl 控件(如 TListView)定义的现有 VCL 样式挂钩

TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook);

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

在此处输入图像描述

于 2012-12-18T22:21:16.740 回答
4

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

在此处输入图像描述

您可以在此博客文章中找到有关此功能的更多信息。

于 2013-11-11T16:38:07.317 回答