2013-07-08 25 views
7

Tôi đang cố gắng mô phỏng trình đơn xem cây trong khung bên trái của Outlook 2013 cho ứng dụng của tôi. Tôi đang sử dụng CustomDraw vì tôi chỉ muốn thay đổi một số thuộc tính phông chữ và nền đơn giản.TTreeXem bản vẽ tùy chỉnh của các mục được chọn

Dưới đây là những gì tôi muốn:

Outlook 2013 sidebar menu

Tuy nhiên, tôi luôn nhận được sự mặc định chọn bản vẽ cho cả hai nút theo dõi được lựa chọn và nóng. Tôi không có Windows 7 hoặc XP để xem đây có phải là hành vi bình thường hay không, nếu nó liên quan đến hệ điều hành của tôi (Windows 8).

Đây là những gì tôi nhận được:

Bad imitation of an Outlook 2013 style sidebar menu

Dưới đây là mã của tôi:

procedure TMainForm.TreeView1CustomDrawItem(Sender: TCustomTreeView; 
    Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); 
begin 
    if Node.Level = 1 then 
    Sender.Canvas.Font.Size := Sender.Canvas.Font.Size + 2; 

    if cdsHot in State then 
    Sender.Canvas.Brush.Color := $00F7E6CD 
    else if (cdsSelected in State) or (cdsFocused in State) or 
    (cdsChecked in State) then 
    Sender.Canvas.Brush.Color := $00F2F2F2 
    else 
    Sender.Canvas.Brush.Color := $00DEDEDE; 
    DefaultDraw := true; 
end; 

Làm thế nào tôi có thể rút ra một nền màu khác nhau cho các mục đã chọn và nóng?

+1

Tôi tin rằng bạn phải bỏ chủ đề kiểm soát để tính năng này hoạt động. Vô hiệu hóa các chủ đề thời gian chạy cho ứng dụng, hoặc ít nhất là gọi 'SetWindowTheme' với các chuỗi rỗng trên treeview. –

+0

Có lẽ bạn có thể bắt đầu với VirtualStringTree? –

+0

Thực ra, tôi nghĩ tôi không đúng. Các tài liệu đề cập cụ thể cho các thanh công cụ mà bạn phải tắt kiểu trực quan bằng cách gọi SetWindowTheme, nhưng không đề cập đến bất kỳ điều khiển nào khác. [Link] (http://msdn.microsoft.com/en-us/library/windows/desktop/ff919569%28v=vs.85%29.aspx). –

Trả lời

12

Hãy thử như sau:

enter image description here

type 
    TTreeView = class(Vcl.ComCtrls.TTreeView) 
    protected 
    procedure CreateWnd; override; 
    end; 


uses uxtheme; 

procedure TTreeView.CreateWnd; 
begin 
    inherited; 
    SetWindowTheme(Handle, nil , nil); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 

    TreeView1.Font.Name := 'Segoe UI'; 
    TreeView1.HotTrack := True; 
    TreeView1.Font.Size := TreeView1.Font.Size + 1; 
    TreeView1.Color := $00DEDEDE; 

end; 

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView; 
    Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); 
begin 

    if cdsFocused in State then begin 
    Sender.Canvas.Brush.Color := $00F2F2F2; 
    Sender.Canvas.Font.Color := clblack; 
    Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold]; 
    end else if cdsHot in State then 
    Sender.Canvas.Brush.Color := $00F7E6CD 
    else 
    Sender.Canvas.Brush.Color := $00DEDEDE; 

end; 

Giải thích:

Các tài liệu Microsoft về vấn đề này là vô cùng mờ, những gì tôi có thể nói một cách chắc chắn là bất cứ khi nào một hành động (lựa chọn, theo dõi nóng, bỏ chọn vv ...) được thực hiện trên một Item (Node), một thông báo cụ thể được gửi đi, thông báo này bao gồm trạng thái của Node thông qua cờ tham số, trong đó cuối cùng nội bộ quyết định Item sẽ được cập nhật trực quan như thế nào dựa trên Windows Theme hiện tại.

Đây là nguyên nhân có thể xảy ra là tại sao việc tắt chủ đề cho thành phần TreeView xóa hình chữ nhật lựa chọn mặc định là & màu chủ đề. Tài liệu cho số Control state flags hỗ trợ lý thuyết này một phần.

+1

Bất kỳ lời giải thích nào về lý do tại sao bạn phải vô hiệu hoá chúng trên điều khiển tô màu để làm việc? –

+0

Bởi vì với theming các mục được chọn về cơ bản là mặt nạ. Màu sắc của anh ta được rút ra nhưng dưới khu vực lựa chọn theo chủ đề thực tế. – Peter

+0

không đúng, nhưng đó cũng không phải là điều tôi muốn hỏi. Không đúng vì các màu đó được trả về với các thành viên clrText và clrTextBk của cấu trúc NMTVCUSTOMDRAW sẽ được hệ thống sử dụng khi vẽ. Hệ thống hoặc sử dụng những màu đó hay không, không có tranh vẽ. Nhưng dù sao, những gì tôi có nghĩa là để hỏi là bạn có bất kỳ tài liệu tham khảo MS cho vô hiệu hóa theming trên sự kiểm soát? Nếu không, hành vi bạn quan sát cũng là hành vi mà tôi quan sát. –

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