Lavorando su WinForms, ho cercato di creare una treeview che mi permettesse di disegnare a piacimento i nodi, le icone ed il testo. Con le "nuove" Windows Forms, è stato esposto l'evento DrawNode e DrawItem dei controlli TreeView e ListView, per cui è possibile gestire in modo autonomo il disegno dei nodi . Facendo l'overrides del metodo OnDrawNode, quindi, mi sono creato una treeview che imita il comportamento della toolbox di Visual Studio. Il codice per l'overrides è riportato qui sotto.
Protected Overrides Sub OnDrawNode(ByVal e As System.Windows.Forms.DrawTreeNodeEventArgs)
'Clear Background
e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)
Dim _rect As Rectangle = Rectangle.Inflate(e.Bounds, -1, -1)
If e.Bounds.Width > 0 AndAlso e.Bounds.Height > 0 Then
If e.Node.Parent Is Nothing Then
Dim _boldFont As New Font(Me.Font, FontStyle.Bold)
If e.Node.IsSelected Then
'Selected Root node
Dim _backGroundBrush As New SolidBrush(Color.FromArgb(255, 225, 230, 232))
e.Graphics.FillRectangle(_backGroundBrush, _rect)
Dim _borderPen As Pen = New Pen(Color.FromArgb(255, 49, 106, 194))
e.Graphics.DrawRectangle(_borderPen, _rect)
_backGroundBrush.Dispose()
_borderPen.Dispose()
Else
'Standard Root Node
Dim _gradientBrush As New Drawing2D.LinearGradientBrush(_rect, Color.FromArgb(255, 221, 220, 203), Color.FromArgb(255, 196, 193, 176), Drawing2D.LinearGradientMode.Vertical)
e.Graphics.FillRectangle(_gradientBrush, _rect)
_gradientBrush.Dispose()
End If
e.Graphics.DrawString(e.Node.Text, _boldFont, Brushes.Black, e.Bounds.X + e.Node.TreeView.Indent, e.Bounds.Y + 2)
If e.Node.IsExpanded Then
e.Graphics.DrawImage(My.Resources.Minus, e.Bounds.X + 7, e.Bounds.Y + 4, 9, 9)
Else
e.Graphics.DrawImage(My.Resources.Plus, e.Bounds.X + 7, e.Bounds.Y + 4, 9, 9)
End If
Else
If Not e.Node.TreeView.ImageList Is Nothing Then
Dim _image As Image = e.Node.TreeView.ImageList.Images(e.Node.ImageIndex)
If Not _image Is Nothing Then
e.Graphics.DrawImage(_image, e.Bounds.X + 9, e.Bounds.Y + 1, 16, 16)
End If
End If
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, e.Bounds.X + e.Node.TreeView.Indent + 7, e.Bounds.Y + 2)
End If
End If
End Sub
Attenzione!! Dovete creare una vostra treeview, ereditando dal controllo TreeView ed impostare il DrawMode a OwnerDrawAll. Considerando che è possibile far disegnare ciò che si vuole e che il nodo stesso può essere una classe derivata da TreeViewNode, non è difficile pensare alle applicazioni che questo approccio può avere.