2011-12-06 33 views
6

Có thể sử dụng TTreeView tiêu chuẩn để thay đổi Hình ảnh Mở rộng và Thu gọn không?TTreeView - Thay đổi Mở rộng và Thu gọn Hình ảnh?

Tôi không có ý hình ảnh Node, ý tôi là các mũi tên nhỏ bên cạnh nút mà có con, như vậy:

enter image description here

Lý tưởng nhất là tôi muốn các mũi tên để hiển thị như + và - Các ký hiệu, như Delphi cây cấu trúc thành phần:

enter image description here

Nếu chúng ta có thể thay đổi điều này, làm thế nào tôi sẽ đi về làm việc đó?

Demo làm việc dựa trên trả lời của 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. 

Kết quả:

enter image description here

Trả lời

9

Tree quan điểm trong bài-Vista Windows có hai chủ đề khác. Chủ đề mà bạn muốn tránh được gọi là chủ đề thám hiểm. Bạn muốn sử dụng chủ đề chuẩn. Kiểm soát phải chọn tham gia để có chủ đề trình khám phá. Làm như vậy thông qua API SetWindowTheme. Điều khiển chế độ xem dạng cây VCL gọi điều này để chọn tham gia. Nó làm như vậy vào cuối phương thức CreateWnd của nó.

Bạn có thể trở lại với chủ đề tiêu chuẩn bằng việc lùi lại thay đổi như thế này:

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; 

Mã này được viết cho XE2. Nếu bạn có một Delphi trước đó thì tôi nghĩ bạn muốn nó như thế này:

if ThemeServices.Enabled and CheckWin32Version(6, 0) then 
    SetWindowTheme(Handle, nil, nil); 
+0

rất am hiểu :) Tôi sẽ phải thử giải pháp sau đã đăng của bạn .. –

+0

Bạn chỉ có thể gọi hàm từ biểu mẫu OnCreate để kiểm tra. Cách tiếp cận CreateWnd là những gì bạn cần để "làm điều đó đúng". –

+0

hoạt động nhờ tuyệt vời, tôi sẽ chỉnh sửa bài đăng hàng đầu với cách tôi đã thực hiện câu trả lời của bạn. –

3

Tôi thêm vào câu trả lời của Davids. Đặt mã sau vào một số đơn vị bổ sung và thêm nó vào các mục đích sử dụng sau đơn vị ComCtrls. Bằng cách đó bạn có thể sử dụng TTreeView tiêu chuẩn và thay đổi chủ đề bất cứ khi nào bạn muốn. Hoặc đăng ký nó trong gói của riêng bạn nếu bạn muốn.

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; 

Trong phiên bản Delphi bạn cũng có thể sử dụng trình trợ giúp lớp để tránh thừa kế thừa.

+0

Điều quan trọng là phải làm điều này trong CreateWnd vì có thể tạo lại cửa sổ xử lý. –

+1

Đây không phải là trợ giúp của lớp học. Lớp người trợ giúp là xây dựng mã cụ thể (loại THelper = lớp helper cho THelpedClass hoặc một số như vậy, tôi không chắc chắn về cú pháp chính xác ở đây, như tôi không sử dụng chúng nhiều). Những gì bạn đang làm trong ví dụ của bạn thường được biết đến như là một 'lớp ngăn chặn'. –

+0

@Marjan Đúng. Và còn gì nữa, nếu bạn định sử dụng một máy đánh chặn thì 'CreateWnd' sẵn sàng để ghi đè lên. –

Các vấn đề liên quan