2012-01-17 63 views
1

我想知道是否可以在Winforms TreeView中將TreeIode的StateImage的位置切換爲IndexImage的位置?在Winforms TreeView控件中切換TreeNode的StateImage和IndexImage的位置

請參考下圖以獲取圖示。

A TreeNode with a StateImage and the bottom TreeNode without a StateImage

第一樹節點具有stateImage,第二個沒有。

我的目標是讓所有的IndexImages對齊左邊,StateImage(如果有的話)位於IndexImage的右邊。

結果樹看起來是這樣的:

resulting tree with IndexImages aligned left

我想我必須設置樹DrawMode到的OwnerDraw和重寫的OnPaint。我讀了this msdn鏈接,但沒有說關於繪製圖像。我真的不知道如何繼續。任何幫助和代碼,你可以提供(在C#或VB.net)將非常感激。

非常感謝

回答

1

是的,這需要自定義繪製。

TreeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll 

然後你必須處理DrawNode事件。見TreeView.DrawNode Event

DrawNode事件的DrawTreeNodeEventArgs參數有一個圖形對象,你可以用它來畫什麼,從圖片到文字。

當然,一旦你去定製,你負責繪製一切(不幸)。有關獲取適當的TreeView字形的信息,請參閱VisualStyles

簡單說明:

Private Sub TreeView1_DrawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode 
    Dim nodeLeft As Integer = (e.Node.Level * 16) + 16 
    e.Graphics.DrawImage(ImageOne, nodeLeft, e.Bounds.Top) 
    e.Graphics.DrawImage(ImageTwo, nodeLeft + 16, e.Bounds.Top) 
    e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, nodeLeft + 32, e.Bounds.Top) 
End Sub 

此示例缺少代碼繪製樹控件和選擇狀態,但它示出了兩個圖像和文本節點。自定義繪圖TreeViews有很多工作。

+0

感謝您的回覆。你昨晚給你的鏈接非常有用。我已經處理繪製具有狀態圖像的子節點。對於我設置e.DrawDefault = True的所有其他節點。這解決了我的問題,並減少了我不得不編寫的代碼量。剩下的唯一問題是使用狀態圖像爲選定的子節點繪製突出顯示。我用FillRectangle與SystemBrushes.Highlight,但我沒有一致的外觀。我會看你在更新中提供的VisualStyles鏈接以獲取任何靈感。 – mazrabul 2012-01-18 17:33:52