是否可以使用 VCL 样式对 TOpenDialog 和 TOpenPictureDialog 进行蒙皮?
2 回答
简短的回答是不,目前无法使用 Delphi XE2 或 XE3 直接将 Vcl 样式应用于非 VCL 表单(或在 VCL 应用程序之外创建的表单)。
现在长答案,在技术上可以将 Vcl 样式应用于此类对话框,但这需要大量工作(相信我需要大量工作)。
关键是使用WH_CBT Hook,检测HCBT_CREATEWND
代码,然后检查窗口#32770
的类是否是(对话框的类)。从这里您可以使用带有索引的函数替换窗口过程。SetWindowLong
GWL_WNDPROC
这是简单的部分,现在您可以控制窗口对话框发送的消息,您必须遍历子控件并 使用 GWL_WNDPROC 索引再次替换窗口过程。这可以通过为 Windows 对话框(按钮、syslistview32、Combobox 等)中使用的每个控件创建 Wrapper 类(这是一项艰巨的工作)来完成
这是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 控件(如 TListView)定义的现有 VCL 样式挂钩
TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook);
我已经完成了上面描述的部分任务,但还没有完成,因此这种项目需要很多时间。
对于任何感兴趣的人,VCL Styles Utils Project
现在支持对话框
您可以在此博客文章中找到有关此功能的更多信息。