更改展开和折叠图像?

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

我不是指节点图像,而是指有孩子的节点旁边的小箭头,如下所示:

理想情况下,我希望箭头显示为+和 - 符号,就像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');
    Items.AddChild(Node, 'Item');
  end;
end;

end.

结果:


Vista后Windows中的树视图有两个可选主题。 您想要避免的主题被称为资源管理器主题。 你想使用标准主题。 控件必须选择加入以获取资源管理器主题。 它通过SetWindowTheme API来完成。 VCL树视图控件调用它来选择加入。 它在CreateWnd方法的末尾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);

我除了戴维斯的回答。 将下面的代码放在一些额外的单位中,并将其添加到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;

在没有Delphi版本的情况下,您也可以使用类助手来避免额外的继承。

链接地址: http://www.djcxy.com/p/34985.html

上一篇: Change Expand and Collapse Image?

下一篇: Slider (on/off) style component similar to iPad