是否可以使用标准TTreeView更改展开和折叠图像?
我不是指Node图片,我的意思是有孩子的节点旁边的小箭头,如下所示:
理想情况下,我希望箭头显示为+和 - 符号,就像Delphi组件结构树一样:
如果可以改变这个,我该怎么做呢?
基于大卫答案的工作演示
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');
Items.AddChild(Node, 'Item');
end;
end;
end.
结果:
答案 0 :(得分:9)
Vista后的Windows视图Windows有两个不同的主题。您想要避免的主题称为资源管理器主题。您想使用标准主题。控件必须选择加入以获取资源管理器主题。它是通过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, nil);
end;
此代码是为XE2编写的。如果你有一个早期的Delphi,那么我认为你想要这样:
if ThemeServices.Enabled and CheckWin32Version(6, 0) then
SetWindowTheme(Handle, nil, nil);
答案 1 :(得分:3)
我除了戴维斯的回答。将以下代码放在一些额外的单元中,并将其添加到ComCtrls单元后的用途中。这样您就可以使用标准的TTreeView并随时更改主题。如果您愿意,可以在自己的包装中注册。
type
TTreeView = class(ComCtrls.TTreeView)
private
procedure SetExplorerTheme(const Value: Boolean);
public
property ExplorerTheme: Boolean write SetExplorerTheme;
end;
procedure TTreeView.SetExplorerTheme(const Value: Boolean);
begin
if ThemeServices.ThemesEnabled and CheckWin32Version(6, 0) then
if Value then
SetWindowTheme(Handle, 'Explorer', nil)
else
SetWindowTheme(Handle, nil, nil);
end;
在Never Delphi版本中,你也可以使用类助手来避免额外的继承。