是否可以使用VCL样式为OpenDialog和TOpenPictureDialog设置外观?
答案 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);
我已经完成了上述部分任务,但尚未完成,因此这类项目需要大量时间。
答案 1 :(得分:4)