TTreeView - 更改展开和折叠图像?

时间:2011-12-06 20:48:01

标签: delphi treeview

是否可以使用标准TTreeView更改展开和折叠图像?

我不是指Node图片,我的意思是有孩子的节点旁边的小箭头,如下所示:

enter image description here

理想情况下,我希望箭头显示为+和 - 符号,就像Delphi组件结构树一样:

enter image description here

如果可以改变这个,我该怎么做呢?

基于大卫答案的工作演示

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.

结果:

enter image description here

2 个答案:

答案 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版本中,你也可以使用类助手来避免额外的继承。