是否可以使用VCL syles为TOpenDialog和TOpenPictureDialog设置外观?
简短的答案是否,目前使用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)
我已经完成了上面描述的部分任务,但还没有完成,因为这种项目需要很多时间.

| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |