在Winforms TreeView控件中切换TreeNode的StateImage和IndexImage的位置

时间:2012-01-17 23:48:52

标签: vb.net winforms .net-3.5 treeview treenode

我想知道是否可以在Winforms TreeView中将StateImage的位置切换为TreeIode的IndexImage的位置?

请参阅下图以获取说明。

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

第一个TreeNode有一个stateImage,第二个没有。

我的目标是让所有IndexImages与左边对齐,StateImage(如果有的话)在IndexImage的右边。

结果树看起来像:

resulting tree with IndexImages aligned left

我想我必须将树DrawMode设置为OwnerDraw并覆盖OnPaint。我阅读this msdn链接,但没有关于绘制图像的说法。我真的不知道该怎么办。您可以提供的任何帮助和代码(在C#或VB.net中)都将非常感激。

非常感谢

1 个答案:

答案 0 :(得分:1)

是的,这需要自定义绘图。

TreeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll

然后你必须处理DrawNode事件。见TreeView.DrawNode Event

DrawTreeNodeEventArgs事件中的DrawNode参数有一个图形对象,可用于绘制从图像到文本的任何内容。

当然,一旦你去定制,你就有责任画一切(不幸的是)。有关获取正确的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需要做很多工作。