TreeView——DrawNode请帮助修改一点错误
该段代码来自微软的示例,可以绘制节点的文字、连线。
目前有以下问题:
1:想添加节点图标,绘制位置不正确;
2:绘制时总是在顶端跳到字符,TreeView.BeginUpdate 、TreeView.EndUpdate 放在哪里适合?
Public Sub New()
' 此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
AddHandler Me.MouseDown, AddressOf myTreeView_MouseDown
End Sub
Private Sub Tmb_DrawNode(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawTreeNodeEventArgs) Handles Me.DrawNode
Dim Image As Drawing.Image = Me.ImageList1.Images(e.Node.ImageIndex)
' Draw the background and node text for a selected node.
If (e.State And TreeNodeStates.Selected) <> 0 Then
' Draw the background of the selected node. The NodeBounds
' method makes the highlight rectangle large enough to
' include the text of a node tag, if one is present.
e.Graphics.FillRectangle(Brushes.Green, NodeBounds(e.Node))
' Retrieve the node font. If the node font has not been set,
' use the TreeView font.
Dim nodeFont As Font = e.Node.NodeFont
If nodeFont Is Nothing Then
nodeFont = CType(sender, TreeView).Font
End If
' Draw the node text.
e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, _
e.Bounds.Right - 2, e.Bounds.Top)
图片位置不正确
e.Graphics.DrawImage(Image, e.Bounds.Right, e.Bounds.Top)
' Use the default background and node text.
Else
e.DrawDefault = True
End If
' If a node tag is present, draw its string representation
' to the right of the label text.
If Not (e.Node.Tag Is Nothing) Then
e.Graphics.DrawString(e.Node.Tag.ToString(), Me.Font, _
Brushes.Yellow, e.Bounds.Right + 2, e.Bounds.Top)
图片位置不正确
e.Graphics.DrawImage(Image, e.Bounds.Right, e.Bounds.Top)
End If
' If the node has focus, draw the focus rectangle large, making
' it large enough to include the text of the node tag, if present.
If (e.State And TreeNodeStates.Focused) <> 0 Then
Dim focusPen As New Pen(Color.Black)
Try
focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot
Dim focusBounds As Rectangle = NodeBounds(e.Node)
focusBounds.Size = New Size(focusBounds.Width - 1, _
focusBounds.Height - 1)
e.Graphics.DrawRectangle(focusPen, focusBounds)
Finally
focusPen.Dispose()
End Try
End If
End Sub
Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
Dim clickedNode As TreeNode = Me.GetNodeAt(e.X, e.Y)
If NodeBounds(clickedNode).Contains(e.X, e.Y) Then
Me.SelectedNode = clickedNode
End If
End Sub 'myTreeView_MouseDown
' Returns the bounds of the specified node, including the region
' occupied by the node label and any node tag displayed.
Private Function NodeBounds(ByVal node As TreeNode) As Rectangle
' Set the return value to the normal node bounds.
Dim bounds As Rectangle = node.Bounds
If Not (node.Tag Is Nothing) Then
' Retrieve a Graphics object from the TreeView handle
' and use it to calculate the display width of the tag.
Dim g As Graphics = Me.CreateGraphics()
Dim tagWidth As Integer = CInt(g.MeasureString( _
node.Tag.ToString(), Me.Font).Width) + 6
' Adjust the node bounds using the calculated value.
bounds.Offset(tagWidth \ 2, 0)
bounds = Rectangle.Inflate(bounds, tagWidth \ 2, 0)
g.Dispose()
End If
Return bounds
End Function 'NodeBounds