ComboBoxTreeClass.vb
上传用户:hbmarket
上传日期:2022-08-01
资源大小:45k
文件大小:11k
源码类别:

组合框控件

开发平台:

Visual Basic

  1. Imports System.ComponentModel
  2. Imports System.Runtime.InteropServices
  3. Imports System.Windows.Forms
  4. Imports System.Drawing
  5. Namespace Controls
  6.     Friend Class ComboBoxTreeClass
  7.         Inherits System.Windows.Forms.ComboBox
  8. #Region " Windows Form Designer generated code "
  9.         Public Sub New()
  10.             MyBase.New()
  11.             'This call is required by the Windows Form Designer.
  12.             InitializeComponent()
  13.             'Add any initialization after the InitializeComponent() call
  14.             Me.DrawMode = DrawMode.OwnerDrawFixed
  15.         End Sub
  16.         'UserControl overrides dispose to clean up the component list.
  17.         Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
  18.             If disposing Then
  19.                 If Not (components Is Nothing) Then
  20.                     components.Dispose()
  21.                 End If
  22.             End If
  23.             MyBase.Dispose(disposing)
  24.         End Sub
  25.         'Required by the Windows Form Designer
  26.         Private components As System.ComponentModel.IContainer
  27.         'NOTE: The following procedure is required by the Windows Form Designer
  28.         'It can be modified using the Windows Form Designer.  
  29.         'Do not modify it using the code editor.
  30.         Private Sub InitializeComponent()
  31.             components = New System.ComponentModel.Container
  32.         End Sub
  33. #End Region
  34.         Public Event BeforeSelect(ByVal Node As TreeNode, ByRef Cancel As Boolean)
  35.         Public Event AfterSelect()
  36.         Public Shadows Event DropDown()
  37.         Public Shadows Event CloseUp()
  38.         Friend WithEvents TreeView As New System.Windows.Forms.TreeView
  39.         Private IsDroppingDown As Boolean = False
  40.         Private FocusOnMouseLeave As Boolean = False
  41.         Private FocusOnVisibleChanged As Boolean = False
  42.         Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Integer
  43.         Private Const SW_HIDE As Integer = 0
  44.         Private Const WM_CTLCOLORLISTBOX As Int32 = &H134
  45.         'Private Const CBN_DROPDOWN = 7
  46.         'Private Const CBN_CLOSEUP = 8
  47.         'Private Const WM_USER As Integer = &H400
  48.         'Private Const WM_COMMAND As Integer = &H111
  49.         'Private Const OCM__BASE As Integer = WM_USER + &H1C00
  50.         'Private Const OCM_COMMAND As Integer = OCM__BASE + WM_COMMAND
  51.         'Private Function HiWord(ByVal Value As Integer) As Short
  52.         '    Return CShort(New System.Drawing.Point(value).Y)
  53.         'End Function
  54. #Region " ComboBox Properties and Methods "
  55.         Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  56.             ' Hide the standard dropdown window of the combobox control
  57.             If m.Msg = WM_CTLCOLORLISTBOX Then
  58.                 Call ShowWindow(m.LParam, SW_HIDE)
  59.                 'ElseIf m.Msg = OCM_COMMAND Then
  60.                 '    Select Case HiWord(m.WParam.ToInt32)
  61.                 '        Case CBN_CLOSEUP
  62.                 '        Case CBN_DROPDOWN
  63.                 '    End Select
  64.             End If
  65.             MyBase.WndProc(m)
  66.         End Sub
  67.         Public Shadows Property SelectedItem() As TreeNode
  68.             Get
  69.                 Dim CurrentSelection As TreeNodeEx = MyBase.SelectedItem
  70.                 If CurrentSelection Is Nothing Then
  71.                     Return Nothing
  72.                 Else
  73.                     Return CurrentSelection.TreeNode
  74.                 End If
  75.             End Get
  76.             Set(ByVal Value As TreeNode)
  77.                 If Value Is Nothing Then
  78.                     Dim Cancel As Boolean = False
  79.                     RaiseEvent BeforeSelect(Nothing, Cancel)
  80.                     If Cancel Then Exit Property
  81.                     Me.TreeView.SelectedNode = Nothing
  82.                     Me.Items.Clear()
  83.                     RaiseEvent AfterSelect()
  84.                 Else
  85.                     Me.TreeView.SelectedNode = Value
  86.                 End If
  87.             End Set
  88.         End Property
  89.         Public Shadows Property DroppedDown() As Boolean
  90.             Get
  91.                 Return Me.TreeView.Visible
  92.             End Get
  93.             Set(ByVal Value As Boolean)
  94.                 If IsDroppingDown Then Exit Property
  95.                 IsDroppingDown = True
  96.                 If Value Then
  97.                     If Not Me.TreeView.Visible Then
  98.                         Me.TreeView.BringToFront()
  99.                         Me.TreeView.Show()
  100.                         Me.Focus()
  101.                         Me.TreeView.Focus()
  102.                         RaiseEvent DropDown()
  103.                     End If
  104.                 ElseIf Me.TreeView.Visible Then
  105.                     Me.TreeView.Hide()
  106.                     RaiseEvent CloseUp()
  107.                 End If
  108.                 IsDroppingDown = False
  109.             End Set
  110.         End Property
  111.         Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
  112.             If e.Index = -1 Then Return
  113.             ' Draw only the combo edit box
  114.             If (e.State And DrawItemState.ComboBoxEdit) <> DrawItemState.ComboBoxEdit Then Return
  115.             Dim ComboBoxSelection As TreeNodeEx
  116.             Try
  117.                 ComboBoxSelection = CType(Me.Items(e.Index), TreeNodeEx)
  118.                 e.DrawFocusRectangle()
  119.                 e.DrawBackground()
  120.                 Dim TextLeft As Integer = e.Bounds.Left
  121.                 If Not Me.TreeView.ImageList Is Nothing Then
  122.                     Dim ImageIndex As Integer = ComboBoxSelection.TreeNode.SelectedImageIndex
  123.                     If ImageIndex < 0 Then ImageIndex = Me.TreeView.SelectedImageIndex
  124.                     If ImageIndex >= 0 Then
  125.                         Dim IconRectangle As Rectangle
  126.                         If Me.TreeView.ImageList.ImageSize.Height > Me.ItemHeight Then
  127.                             IconRectangle = New Rectangle(e.Bounds.Left + 2, e.Bounds.Top, Me.ItemHeight, Me.ItemHeight)
  128.                         Else
  129.                             IconRectangle = New Rectangle(New Point(e.Bounds.Left + 2, e.Bounds.Top), Me.TreeView.ImageList.ImageSize)
  130.                         End If
  131.                         Me.TreeView.ImageList.Draw(e.Graphics, IconRectangle.Left, IconRectangle.Top, IconRectangle.Width, IconRectangle.Height, ImageIndex)
  132.                         TextLeft = TextLeft + IconRectangle.Width + 2
  133.                         IconRectangle = Nothing
  134.                     End If
  135.                 End If
  136.                 e.Graphics.DrawString(ComboBoxSelection.TreeNode.Text, Me.Font, New SolidBrush(e.ForeColor), TextLeft, e.Bounds.Top + 2)
  137.             Catch ex As Exception
  138.                 Throw ex
  139.             Finally
  140.                 ComboBoxSelection = Nothing
  141.                 MyBase.OnDrawItem(e)
  142.             End Try
  143.         End Sub
  144.         Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs)
  145.             If Not Me.DroppedDown Then Me.DroppedDown = True
  146.         End Sub
  147.         Protected Overrides Sub OnCreateControl()
  148.             Me.TreeView.Visible = False
  149.             Me.TreeView.Height = 194
  150.             Me.TreeView.ImageIndex = 0
  151.             Me.TreeView.SelectedImageIndex = 1
  152.             Me.TreeView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  153.             Me.TreeView.TabIndex = Me.TabIndex
  154.             Me.TreeView.TabStop = False
  155.             Me.TreeView.HideSelection = False
  156.         End Sub
  157.         Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
  158.             If ((e.KeyCode = Keys.Up) OrElse (e.KeyCode = Keys.Down)) AndAlso (e.Modifiers = Keys.Alt) Then
  159.                 e.Handled = True
  160.                 Me.DroppedDown = True
  161.             End If
  162.         End Sub
  163.         Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
  164.             If Me.DroppedDown Then
  165.                 Me.DroppedDown = False
  166.                 Me.Focus()
  167.                 Me.FindForm.Focus()
  168.                 Me.Focus()
  169.             End If
  170.         End Sub
  171. #End Region
  172. #Region " TreeView Methods "
  173.         Private Sub TreeView_BeforeSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView.BeforeSelect
  174.             RaiseEvent BeforeSelect(e.Node, e.Cancel)
  175.         End Sub
  176.         Private Sub TreeView_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView.AfterSelect
  177.             Me.Items.Clear()
  178.             Me.Items.Add(New TreeNodeEx(e.Node))
  179.             Me.SelectedIndex = 0
  180.             If e.Action = TreeViewAction.ByMouse Then
  181.                 FocusOnMouseLeave = True
  182.                 Me.DroppedDown = False
  183.             End If
  184.             RaiseEvent AfterSelect()
  185.         End Sub
  186.         Private Sub TreeView_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TreeView.KeyPress
  187.             If (e.KeyChar = ControlChars.Cr) OrElse (e.KeyChar = ChrW(System.Windows.Forms.Keys.Escape)) Then
  188.                 e.Handled = True
  189.                 FocusOnVisibleChanged = True
  190.                 Me.DroppedDown = False
  191.             End If
  192.         End Sub
  193.         Private Sub TreeView_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView.Leave
  194.             If Not Me.Focused Then Me.DroppedDown = False
  195.         End Sub
  196.         Private Sub TreeView_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView.MouseLeave
  197.             If FocusOnMouseLeave Then
  198.                 FocusOnMouseLeave = False
  199.                 Me.Focus()
  200.                 Me.FindForm.Focus()
  201.                 Me.Focus()
  202.             End If
  203.         End Sub
  204.         Private Sub TreeView_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView.VisibleChanged
  205.             If FocusOnVisibleChanged Then
  206.                 FocusOnVisibleChanged = False
  207.                 Me.Focus()
  208.                 Me.FindForm.Focus()
  209.                 Me.Focus()
  210.             End If
  211.         End Sub
  212.         Private Sub TreeView_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TreeView.KeyDown
  213.             If ((e.KeyCode = Keys.Up) OrElse (e.KeyCode = Keys.Down)) AndAlso (e.Modifiers = Keys.Alt) Then
  214.                 e.Handled = True
  215.                 FocusOnVisibleChanged = True
  216.                 Me.DroppedDown = False
  217.             End If
  218.         End Sub
  219. #End Region
  220.         Private Class TreeNodeEx
  221.             Public TreeNode As TreeNode
  222.             Public Sub New(ByVal Node As TreeNode)
  223.                 Me.TreeNode = Node
  224.             End Sub
  225.             Public Overrides Function ToString() As String
  226.                 Return Me.TreeNode.Text
  227.             End Function
  228.         End Class
  229.     End Class
  230. End Namespace