TTreeView - Изменить, развернуть и свернуть изображение? - PullRequest
6 голосов
/ 07 декабря 2011

Возможно ли использование стандартного TTreeView для изменения развернутого и свернутого изображения?

Я не имею в виду изображения узлов, я имею в виду маленькие стрелки рядом с узлами, которые имеют дочерние элементы, например:

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 ]

10 голосов
/ 07 декабря 2011

Представления дерева в Windows после Vista имеют две альтернативные темы. Тема, которую вы хотите избежать, называется темой проводника. Вы хотите использовать стандартную тему. Элемент управления должен зарегистрироваться, чтобы получить тему проводника. Это делается через API SetWindowTheme. Элемент управления представлением дерева VCL вызывает это для подписки. Это делается в конце метода 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);
3 голосов
/ 07 декабря 2011

Я дополнение к ответу Давида. Поместите следующий код в какой-то дополнительный модуль и добавьте его в использование после модуля 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, которые вы никогда не используете, вы также можете использовать помощник классов, чтобы избежать дополнительного наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...