是否可以使用标准TTreeView更改展开和折叠图像?
我不是指Node图像,我的意思是带有子节点的节点旁边的小箭头,如下所示:
理想情况下,我希望箭头显示为和 – 符号,如Delphi组件结构树:
如果可以改变这个,我该怎么做呢?
基于David的答案的工作演示
unit Unit1; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ComCtrls,Themes,uxTheme; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; type TMyTreeView = class(TTreeView) protected procedure CreateWnd; override; end; var Form1: TForm1; implementation {$R *.dfm} { TMyTreeView } procedure TMyTreeView.CreateWnd; begin inherited; if ThemeServices.Enabled and CheckWin32Version(6,0) then SetWindowTheme(Handle,nil,nil); end; procedure TForm1.FormCreate(Sender: TObject); var MyTree: TMyTreeView; Node: TTreeNode; begin MyTree := TMyTreeView.Create(nil); with MyTree do begin Parent := Self; Height := 100; Width := 100; Left := 30; Top := 30; Node := Items.Add(nil,'Item'); Items.AddChild(Node,'Item'); Node := Items.AddChild(Node,'Item'); end; end; end.
结果:
解决方法
后Vista中的树视图有两个不同的主题.您想要避免的主题称为资源管理器主题.您想使用标准主题.控件必须选择加入以获取资源管理器主题.它通过
SetWindowTheme
API实现. VCL树视图控件将其调用为opt-in.它在CreateWnd方法的末尾执行此操作.
您可以通过撤消这样的更改来恢复到标准主题:
type TMyTreeView = class(TTreeView) protected procedure CreateWnd; override; end; procedure TMyTreeView.CreateWnd; begin inherited; if StyleServices.Enabled and TOSVersion.Check(6) and StyleServices.IsSystemStyle then SetWindowTheme(Handle,nil); end;
此代码是为XE2编写的.如果你有一个早期的Delphi,那么我认为你想要这样:
if ThemeServices.Enabled and CheckWin32Version(6,nil);