2012-05-17 132 views
6

如何使用我自己的自定義按鈕(圖像)替換VST中的默認[-]/[+]按鈕?
我想用箭頭代替(enter image description here,enter image description here),但也支持RTL雙向模式(enter image description here,enter image description here)。TVirtualStringTree - 如何更改[ - ]/[+]按鈕?

編輯:我知道bsTriangle風格(ButtonStyle)。它不尊重RTL。我想使用我自己的自定義圖像。

回答

9

這些圖像通常在Windows Vista和Windows 7中嗎?當您啓用主題時,樹形控件應該在這些系統上自動獲取它們。

接近某個東西的簡單方法是將ButtonStyle屬性設置爲bsTriangle。不過,這並不完全是問題中顯示的圖像。 「減號」箭頭將指向下方而不是對角線,而「加號」箭頭將是實心的而不是輪廓線。

您可以提供自己的位圖。將VT_XPBUTTONMINUS和VT_XPBUTTONPLUS資源更改爲所需的任何圖像,並將ButtonFillMode屬性設置爲fmShaded

雖然我沒有看到基於bi-di模式改變圖像的功能。你可以創建一個覆蓋PaintNodeButton的後代類,然後繪製任何你想要的。從父類複製放置代碼。

+0

謝謝先生。這似乎是重寫'PaintNodeButton'是唯一的選擇。 – ZigiZ

1

查看ButtonStyle屬性。不確定它是否尊重RTL雙向模式思想。

+0

我知道'bsTriangle'風格。它不尊重RTL。我想用我自己的形象。 – ZigiZ

7

IIRC你通過在PaintOptions中包含toUseExplorerTheme來獲得它。然而,這也改變了選擇的外觀(更好的IMNSHO),可能更多。

例如,如果我一個窗體上放置一個TVirtualStringTree並添加以下事件處理程序:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    VT.RootNodeCount := 10; 
    VT.TreeOptions.PaintOptions := VT.TreeOptions.PaintOptions + [toUseExplorerTheme]; 
    VT.OnInitNode := VTInitNode; 
    VT.OnInitChildren := VTInitChildren; 
end; 

procedure TForm1.VTInitChildren(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; var ChildCount: Cardinal); 
begin 
    ChildCount := 3; 
end; 

procedure TForm1.VTInitNode(Sender: TBaseVirtualTree; 
    ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); 
begin 
    Include(InitialStates, ivsHasChildren); 
end; 

我得到 screenshot with triangular markers

編輯:不幸的是,設置Form1.BiDiModebdRightToLeft產量 screenshot with wrong triangular markers 在我的德語Windows 7上。我不知道這是否對阿拉伯語或希伯來語系統更好。

+0

你正在使用什麼版本的VirtualTrees? – ZigiZ

+1

@ZigiZ:位於VirtualTrees.pas頂部的聯繫人說「版本5.0.0」。 –