2012-01-17 72 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