是否可以使用标准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');
Items.AddChild(Node, 'Item');
end;
end;
end.
Run Code Online (Sandbox Code Playgroud)
结果:

Dav*_*nan 10
后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, nil);
end;
Run Code Online (Sandbox Code Playgroud)
此代码是为XE2编写的.如果你有一个早期的Delphi,那么我认为你想要这样:
if ThemeServices.Enabled and CheckWin32Version(6, 0) then
SetWindowTheme(Handle, nil, nil);
Run Code Online (Sandbox Code Playgroud)