Confessions of a Dangerous Mind

Brain.FlushBuffer()
posts - 176, comments - 234, trackbacks - 93

Custom TreeView...con .net 2.0 è facile!

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 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.

Print | posted on venerdì 7 aprile 2006 17:49 | Filed Under [ Tech Tips ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET