如果仅仅是改变两种状态下的颜色,可以这么简单实现 Public Class Form1 Private TestTree As New MyTree Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 0 To 10 TestTree.Nodes.Add("Node" + i.ToString) Next Me.Controls.Add(TestTree) TestTree.Dock = DockStyle.Fill End SubEnd ClassPublic Class MyTree Inherits TreeView Dim NodeStringFormat As StringFormat Public Sub New() NodeStringFormat = New StringFormat NodeStringFormat.LineAlignment = StringAlignment.Center : NodeStringFormat.Alignment = StringAlignment.Center Me.DrawMode = TreeViewDrawMode.OwnerDrawText Me.CheckBoxes = True End Sub Private Sub MyTreeView_DrawNode(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawTreeNodeEventArgs) Handles Me.DrawNode If e.Node.Checked Then e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, e.Bounds, NodeStringFormat) Else Dim r As New Rectangle(e.Bounds.Left - 13, e.Bounds.Top + 1, 13, 13) ControlPaint.DrawCheckBox(e.Graphics, r, ButtonState.Inactive) e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Gray, e.Bounds, NodeStringFormat) End If End Sub End Class
是不是实现Node在勾选和不勾选两种状态下的颜色不同而已?
http://www.codeproject.com/KB/miscctrl/Three_State_TreeView.aspx
Checked = ture;
Public Class Form1 Private TestTree As New MyTree Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 0 To 10
TestTree.Nodes.Add("Node" + i.ToString)
Next
Me.Controls.Add(TestTree)
TestTree.Dock = DockStyle.Fill
End SubEnd ClassPublic Class MyTree
Inherits TreeView Dim NodeStringFormat As StringFormat Public Sub New()
NodeStringFormat = New StringFormat
NodeStringFormat.LineAlignment = StringAlignment.Center : NodeStringFormat.Alignment = StringAlignment.Center Me.DrawMode = TreeViewDrawMode.OwnerDrawText
Me.CheckBoxes = True
End Sub Private Sub MyTreeView_DrawNode(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawTreeNodeEventArgs) Handles Me.DrawNode
If e.Node.Checked Then
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, e.Bounds, NodeStringFormat)
Else
Dim r As New Rectangle(e.Bounds.Left - 13, e.Bounds.Top + 1, 13, 13) ControlPaint.DrawCheckBox(e.Graphics, r, ButtonState.Inactive)
e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Gray, e.Bounds, NodeStringFormat)
End If End Sub
End Class