Public Class ComboboxTreeClass ComboboxTree
Inherits ComboBox
Private Const WM_LBUTTONDOWN As Int32 = &H201
Private Const WM_LBUTTONDBLCLK As Int32 = &H203
Private m_TreeViewHost As ToolStripControlHost
Private m_DropDown As ToolStripDropDown
Private WithEvents TreeViewF As TreeViewForm
Public Event AddNode(ByVal Node As TreeNode)
Public Event DelNode(ByVal Node As TreeNode)
Public Event NodeUp(ByVal Node As TreeNode)
Public Event NodeDown(ByVal Node As TreeNode)
Public Sub New()Sub New()
TreeViewF = New TreeViewForm(New Size(DropDownWidth, DropDownHeight))
m_TreeViewHost = New ToolStripControlHost(TreeViewF)
m_DropDown = New ToolStripDropDown()
With m_DropDown
.AutoSize = False
.Width = Me.Width
.Height = 113
.Items.Add(m_TreeViewHost)
End With
End Sub
Private Sub TreeView_ChangeSize()Sub TreeView_ChangeSize(ByVal NewSize As System.Drawing.Size) Handles TreeViewF.ChangeSize
If NewSize.Width < Me.Width Then NewSize.Width = Me.Width
If NewSize.Height < 113 Then NewSize.Height = 113
m_DropDown.Width = NewSize.Width
m_DropDown.Height = NewSize.Height
m_TreeViewHost.Size = New Size(NewSize.Width - 2, NewSize.Height - 5)
End Sub
Protected Overrides Sub WndProc()Sub WndProc(ByRef m As System.Windows.Forms.Message)
If (m.Msg = WM_LBUTTONDBLCLK Or m.Msg = WM_LBUTTONDOWN) Then
ShowDropDown()
Return
End If
MyBase.WndProc(m)
End Sub
Private Sub ShowDropDown()Sub ShowDropDown()
If Me.DroppedDown = False Then
m_DropDown.Width = Me.Width
m_DropDown.Height = 113
m_TreeViewHost.Size = New Size(DropDownWidth - 2, DropDownHeight + 2)
m_DropDown.Show(Me, 0, Me.Height)
End If
End Sub
自定义的属性和事件#Region " 自定义的属性和事件"
Public ReadOnly Property TreeView()Property TreeView() As TreeView
Get
Return TreeViewF.TreeView
End Get
End Property
Private Sub TreeViewF_AddNode()Sub TreeViewF_AddNode(ByVal Node As System.Windows.Forms.TreeNode) Handles TreeViewF.AddNode
RaiseEvent AddNode(Node)
End Sub
Private Sub TreeViewF_DelNode()Sub TreeViewF_DelNode(ByVal Node As System.Windows.Forms.TreeNode) Handles TreeViewF.DelNode
RaiseEvent DelNode(Node)
End Sub
Private Sub TreeViewF_NodeDown()Sub TreeViewF_NodeDown(ByVal Node As System.Windows.Forms.TreeNode) Handles TreeViewF.NodeDown
RaiseEvent NodeDown(Node)
End Sub
Private Sub TreeViewF_NodeUp()Sub TreeViewF_NodeUp(ByVal Node As System.Windows.Forms.TreeNode) Handles TreeViewF.NodeUp
RaiseEvent NodeUp(Node)
End Sub
#End Region
两个内部类#Region " 两个内部类"
Private Class TreeViewFormClass TreeViewForm
Inherits Control
Private WithEvents m_TreeView As New TreeView
Private WithEvents m_AddButton As New Button
Private WithEvents m_DelButton As New Button
Private WithEvents m_UpButton As New Button
Private WithEvents m_DownButton As New Button
Private WithEvents m_Lable As SizeLabel
Public Event ChangeSize(ByVal NewSize As Size)
Public Event AddNode(ByVal Node As TreeNode)
Public Event DelNode(ByVal Node As TreeNode)
Public Event NodeUp(ByVal Node As TreeNode)
Public Event NodeDown(ByVal Node As TreeNode)
Public Sub New()Sub New(ByVal size As Size)
Me.Size = size
m_Lable = New SizeLabel(Me)
With m_Lable
.Location = New Point(Me.Width - 9, Me.Height - 7)
.Anchor = AnchorStyles.Right + AnchorStyles.Bottom
.BackColor = Color.White
End With
With m_TreeView
.BorderStyle = BorderStyle.None
.Anchor = AnchorStyles.Left + AnchorStyles.Right + AnchorStyles.Bottom + AnchorStyles.Top
.Size = New Size(Me.Width, Me.Height - 22)
.Location = New Point(0, -2)
End With
With m_AddButton
.Anchor = AnchorStyles.Left + AnchorStyles.Bottom
.Size = New Size(20, 20)
.Location = New Point(2, Me.Height - 20)
.Text = "+"
End With
With m_DelButton
.Anchor = AnchorStyles.Left + AnchorStyles.Bottom
.Size = New Size(20, 20)
.Location = New Point(24, Me.Height - 20)
.Text = "-"
End With
With m_UpButton
.Anchor = AnchorStyles.Left + AnchorStyles.Bottom
.Size = New Size(20, 20)
.Location = New Point(46, Me.Height - 20)
.Font = New Font("Marlett", 9, FontStyle.Regular)
.Text = "5"
End With
With m_DownButton
.Anchor = AnchorStyles.Left + AnchorStyles.Bottom
.Size = New Size(20, 20)
.Location = New Point(68, Me.Height - 20)
.Font = New Font("Marlett", 9, FontStyle.Regular)
.Text = "6"
End With
Me.Controls.AddRange(New Control() {m_TreeView, m_AddButton, m_DelButton, m_UpButton, m_DownButton, m_Lable})
End Sub
Public ReadOnly Property TreeView()Property TreeView() As TreeView
Get
Return m_TreeView
End Get
End Property
Private Sub TreeViewForm_Paint()Sub TreeViewForm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim rect As New Rectangle(0, 0, Me.Width, Me.Height)
e.Graphics.FillRectangle(Brushes.White, rect)
e.Graphics.DrawLine(Pens.Black, 0, Me.Height - 22, Me.Width, Me.Height - 22)
End Sub
Private Sub m_Lable_ChangeSize()Sub m_Lable_ChangeSize(ByVal NewSize As System.Drawing.Size) Handles m_Lable.ChangeSize
RaiseEvent ChangeSize(NewSize)
End Sub
Private Sub m_AddButton_Click()Sub m_AddButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_AddButton.Click
RaiseEvent AddNode(m_TreeView.SelectedNode)
End Sub
Private Sub m_DelButton_Click()Sub m_DelButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_DelButton.Click
RaiseEvent DelNode(m_TreeView.SelectedNode)
End Sub
Private Sub m_UpButton_Click()Sub m_UpButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_UpButton.Click
RaiseEvent NodeUp(m_TreeView.SelectedNode)
End Sub
Private Sub m_DownButton_Click()Sub m_DownButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_DownButton.Click
RaiseEvent NodeDown(m_TreeView.SelectedNode)
End Sub
End Class
Private Class SizeLabelClass SizeLabel
Inherits Label
Private PC As Control
Private mouseOffset As Point
Private mousePos As Point
Private OldXY As Point
Public Event ChangeSize(ByVal NewSize As Size)
Public Sub New()Sub New(ByVal P As Control)
PC = P
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.Opaque, False)
Me.Size = New Size(9, 9)
Me.Cursor = Cursors.SizeNWSE
End Sub
Protected Overrides Sub OnPaint()Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
ControlPaint.DrawSizeGrip(e.Graphics, System.Drawing.Color.Black, 1, 0, Me.Size.Width, Me.Size.Height)
End Sub
Private Sub SizeLabel_MouseDown()Sub SizeLabel_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If (e.Button <> Windows.Forms.MouseButtons.Left) Then Return
mouseOffset = Control.MousePosition
OldXY.X = Me.Left
OldXY.Y = Me.Top
End Sub
Private Sub SizeLabel_MouseMove()Sub SizeLabel_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If (e.Button <> Windows.Forms.MouseButtons.Left) Then Return
Dim pos As Point = Control.MousePosition
If mousePos = pos Then Return
mousePos = Control.MousePosition
Dim NewXY As New Point(Me.Left, Me.Top)
Dim CW As Integer = mousePos.X - mouseOffset.X - (NewXY.X - OldXY.X)
Dim CH As Integer = mousePos.Y - mouseOffset.Y - (NewXY.Y - OldXY.Y)
Dim size As New Size(PC.Width + CW, PC.Height + CH)
RaiseEvent ChangeSize(size)
End Sub
End Class
#End Region
end class
四个按钮的功能代码要自行写,可参照我的《移动treeview内的节点》 代码
对不足之处请提出修改意见!