I’m overiding the node draw event for a treeview in draw all mode such as the code below.
Protected Overrides Sub OnDrawNode(ByVal e As System.Windows.Forms.DrawTreeNodeEventArgs)
Try
Dim Indent = e.Node.Level * Me.Indent + 32
Dim font = Me.Font
'draw selected
If e.State And TreeNodeStates.Selected Then
Dim rect As New Rectangle(0, e.Bounds.Location.Y, Me.Width - 1, e.Bounds.Height - 1)
e.Graphics.FillRectangle(Brushes.AliceBlue, rect)
e.Graphics.DrawRectangle(Pens.DarkSlateBlue, rect)
End If
'draw status icon
e.Graphics.DrawImage(Me.ImageList.Images(e.Node.ImageIndex), New Point(e.Bounds.X + indent - Me.ImageList.ImageSize.Width + 2, e.Bounds.Y + ((Me.ItemHeight / 2) - (Me.ImageList.ImageSize.Height / 2))))
'draw collapse glyph
If e.Node.Nodes.Count > 0 Then
Dim element As VisualStyleElement
Dim glyphRect = New Rectangle(e.Bounds.Location.X + 2 + e.Node.Level * Me.Indent, e.Bounds.Location.Y + 8, 16, 16)
If e.Node.IsExpanded Then
element = VisualStyleElement.TreeView.Glyph.Opened
Else
element = VisualStyleElement.TreeView.Glyph.Closed
End If
Dim renderer As New VisualStyleRenderer(element)
renderer.DrawBackground(e.Graphics, glyphRect)
End If
If e.Node.Level.Equals(0) Then
font = New Font(Me.Font.Name, 12, FontStyle.Regular)
e.Graphics.DrawString(e.Node.Text, font, Brushes.MidnightBlue, New Point(indent + 5, e.Bounds.Location.Y + 5), New StringFormat())
ElseIf e.Node.Level.Equals(1) Then
'action
Dim params = CType(e.Node, ActionNode).Params
Dim x = indent + 5
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, New Point(x, e.Bounds.Location.Y + 2), New StringFormat())
For Each param In params
e.Graphics.DrawString(param.Key & ":", Me.Font, Brushes.DarkSlateBlue, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Key & ":", Me.Font).Width - 1
e.Graphics.DrawString(param.Value, Me.Font, Brushes.SlateGray, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Value, Me.Font).Width
Next
ElseIf e.Node.Level.Equals(2) Then
'assertion
Dim params = CType(e.Node, AssertionNode).Params
Dim x = indent + 5
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, New Point(x, e.Bounds.Location.Y + 2), New StringFormat())
For Each param In params
e.Graphics.DrawString(param.Key & ":", Me.Font, Brushes.DarkSlateBlue, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Key & ":", Me.Font).Width - 1
e.Graphics.DrawString(param.Value, Me.Font, Brushes.SlateGray, New Point(x, e.Node.Bounds.Location.Y + 15))
x += e.Graphics.MeasureString(param.Value, Me.Font).Width
Next
End If
Catch ex As Exception
End Try
End Sub
This draws the tree view exactly as I want it but for some reason wen you mouse over the open/close elements the node seems get redrawn but over the top of its last redraw causing the text to look bolded and an outline around any images. This only happens however if the node is not selected and if it is selected then everything is fine. Sorry new user can’t post screen dump.
I’m not sure if you can hook into the mouseover glyph event to just invalidate the control of even detect the sender on the draw event but im out of idears now.
Tried:
- Clearing the graphics object on draw before drawing node
- Setting background rectangle and drawing the node just like when selected
I can only really guess since you couldn’t post an image, and the code you included isn’t complete (ActioNode? AssertionNode?).
I know you mentioned clearing the background, but the code you posted wasn’t clearing the node area. Try changing it to something like this, see if it works:
Why are you ignoring all exceptions?
You also need to dispose your fonts.