意思是:假如我的ComboBox的list中有abcd, abde, acdf等等项目。如果我开始输入a,combobox应当立即显示abcd,并且,bcd是选中状态,以便用户继续输入。如果第二个输入c,则马上显示acdf,并且df是选中状态。我说的combobox是dropdown样式的。

解决方案 »

  1.   

    ---------------------------module1
    Public Const LB_FINDSTRING& = &H18F
    Public Const CB_FINDSTRINGEXACT& = &H14C
    Public Const EM_GETSEL = &HB0
    Public Const EM_LINEFROMCHAR = &HC9
    Public Const EM_LINEINDEX = &HBB
    Public Const CB_GETEDITSEL = &H140
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long------------------------------------form1
    Dim ol As Integer
    Dim isKeyPressed As Boolean
    Dim isKeyBackPressed As Boolean
    Dim isAnySelectedChar As Boolean
    Dim BackLen As Integer
    Dim aStr As String
    Dim I As Integer
    Dim beforeStr As String
    Dim afterStr As String
    Dim cursorPos As Long
    Dim selLen As Integer'²Ù×ÝComboxµÄÐÐΪ
    Private Sub Combo1_Change()
    Dim Blen As Integer
    Dim pos As Long    afterStr = Combo1.Text'Èç¹û·Ç¹¦Äܼü£¨Enter¡¢BackSpace£©°´ÏÂ
    If isKeyPressed Then
        
        ol = Len(Combo1.Text)
        DoEvents
        I = SendMessage(Combo1.hwnd, CB_FINDSTRINGEXACT, -1, ByVal CStr(Combo1.Text))
        If I >= 0 Then
            Combo1.ListIndex = I
            Combo1.SelStart = ol
            Combo1.SelLength = Len(Combo1.Text) - ol
            Combo1.Refresh
        Else
            pos = cursorPos + (Len(afterStr) - (Len(beforeStr) - selLen))
            'pos = FindInsertPos(beforeStr, afterStr)
            Combo1.SelStart = pos
            Combo1.SelLength = 0
        End If
    'MsgBox beforeStr & "-" & afterStr
        '·ÀÖ¹OnChangeʼþ×Ô¼¤£¨ÓÉÓڸıäÁËComboxµÄÄÚÈÝ£©
        isKeyPressed = False
    End If'Èç¹ûBackSpace¼ü°´Ï£¬²Á³ýβ²¿×Ö·û
    If isKeyBackPressed Then     'aStr = Combo1.Text
         
         'Èç¹û°´ÏÂBackSpace¼ü֮ǰÓÐ×Ö·ûÑ¡ÖУ¬ÇÒÑ¡ÖеÄ×Ö·ûÔÚβ²¿£¬Í¬Ê±×Ö·û´®³¤¶È²»Ð¡ÓÚ1
         If isAnySelectedChar Then
            If Len(afterStr) >= 1 Then
                afterStr = Left$(afterStr, Len(afterStr) - 1)
            End If
         End If     ol = Len(afterStr)
         
         DoEvents
            
         'ÕÒ³öComboxÖÐ×î·ûºÏÊäÈë×Ö´®µÄÏîµÄϱê
         I = SendMessage(Combo1.hwnd, CB_FINDSTRINGEXACT, -1, ByVal CStr(afterStr))
           
         'Èç¹ûûÕÒµ½
         If I < 0 Then
         
             pos = cursorPos + (Len(afterStr) - Len(beforeStr))
             '&Egrave;&ccedil;&sup1;&ucirc;&Eacute;&frac34;&sup3;&yacute;&micro;&Auml;×&Ouml;·&ucirc;&sup2;&raquo;&Ocirc;&Uacute;&Icirc;&sup2;&sup2;&iquest;&pound;&not;&Eacute;è&Ouml;&Atilde;&sup1;&acirc;±ê&Ocirc;&Uacute;&Eacute;&frac34;&sup3;&yacute;&Icirc;&raquo;&Ouml;&Atilde;
             If (pos < Len(Combo1.Text)) And (pos > 0) Then
                 Combo1.SelStart = pos
                 Combo1.SelLength = 0
             Else
                 Combo1.ListIndex = I
                 Combo1.SelStart = ol
                 Combo1.SelLength = Len(Combo1.Text) - ol
                
                 '&Egrave;&ccedil;&sup1;&ucirc;&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;×&Ouml;&acute;&reg;&Ograve;&Ntilde;&frac34;&shy;&Icirc;&ordf;&iquest;&Otilde;&pound;&not;&Eacute;è&Ouml;&Atilde;Combox&Iuml;&Ocirc;&Ecirc;&frac34;&iquest;&Otilde;
                 If Len(afterStr) = 0 Then
                     Combo1.Text = ""
                 End If
                 Combo1.Refresh
             End If
                
         '&Egrave;&ccedil;&sup1;&ucirc;&Otilde;&Ograve;&micro;&frac12;&pound;&not;&Euml;&cent;&ETH;&Acirc;Combox&Iuml;&Ocirc;&Ecirc;&frac34;&pound;&not;&sup2;&cent;&Ntilde;&iexcl;&Ouml;&ETH;·&Ccedil;&Ecirc;&auml;&Egrave;&euml;×&Ouml;&acute;&reg;
         Else
             I = SendMessage(Combo1.hwnd, CB_FINDSTRINGEXACT, -1, ByVal CStr(afterStr))
             Combo1.ListIndex = I
              
             '&Egrave;&ccedil;&sup1;&ucirc;&Ocirc;&Uacute;°&acute;BackSpace&frac14;ü&Ouml;&reg;&Ccedil;°&Oacute;&ETH;×&Ouml;·&ucirc;&Ntilde;&iexcl;&Ouml;&ETH;&pound;&not;&Ocirc;òBackSpace&Ouml;&raquo;&sup2;&Aacute;&sup3;&yacute;&Aacute;&Euml;&Ntilde;&iexcl;&Ouml;&ETH;&micro;&Auml;×&Ouml;·&ucirc;&iexcl;&pound;&Ograve;ò&acute;&Euml;&pound;&not;&Ccedil;&iquest;&Ouml;&AElig;&sup2;&Aacute;&Egrave;&yen;&Icirc;&sup2;&sup2;&iquest;×&icirc;&ordm;ó&Ograve;&raquo;&cedil;&ouml;×&Ouml;·&ucirc;
             'If isAnySelectedChar Then
             '    Combo1.SelStart = ol - 1
             'Else
                 Combo1.SelStart = ol
             'End If
             Combo1.SelLength = Len(Combo1.Text) - ol + 1
             Combo1.Refresh
         End If
         
         
         '·&Agrave;&Ouml;&sup1;×&Ocirc;&frac14;¤
         isKeyPressed = False
         isKeyBackPressed = False
    End IfEnd Sub
    '&sup2;&para;&raquo;&ntilde;&Ocirc;&Uacute;Combox&Eacute;&Iuml;&micro;&Auml;&frac14;ü&Aring;&Igrave;&para;&macr;×÷
    Private Sub Combo1_KeyPress(KeyAscii As Integer)
        Dim obj As Object
        Dim I As Long
        Dim j As Long
        
        isKeyPressed = True
        cursorPos = GetCaretPos(Me.ActiveControl.hwnd, I, j)
        
        '&Egrave;&ccedil;&sup1;&ucirc;Enter&frac14;ü°&acute;&Iuml;&Acirc;&pound;&not;&Ecirc;§&Egrave;&yen;&frac12;&sup1;&micro;&atilde;
        If KeyAscii = vbKeyReturn Then
           Set obj = FindNextControl(Me.ActiveControl.TabIndex)
           If Not (obj Is Nothing) Then obj.SetFocus
           Exit Sub
        End If
        
        '&Egrave;&ccedil;&sup1;&ucirc;BackSpace&pound;¨&raquo;&Oslash;&Iacute;&Euml;&frac14;ü&pound;&copy;°&acute;&Iuml;&Acirc;&pound;&not;&sup2;&Aacute;&sup3;&yacute;×&icirc;&ordm;ó&Ograve;&raquo;&cedil;&ouml;×&Ouml;
        If KeyAscii = vbKeyBack Then
            isKeyPressed = False
            isKeyBackPressed = Not isKeyPressed
        End If
        
        '&Eacute;è&Ouml;&Atilde;&iexcl;°&Ocirc;&Uacute;BackSpace&frac14;ü°&acute;&Iuml;&Acirc;&Ouml;&reg;&Ccedil;°&pound;&not;&Ecirc;&Ccedil;·&ntilde;&Oacute;&ETH;&Ntilde;&iexcl;&Ouml;&ETH;&micro;&Auml;×&Ouml;·&ucirc;&iexcl;±&pound;&not;&Iacute;&not;&Ecirc;±&frac14;ì&sup2;é&Ecirc;&Ccedil;·&ntilde;&Ntilde;&iexcl;&Ouml;&ETH;&micro;&Auml;&Ecirc;&Ccedil;&Ouml;&ETH;&frac14;&auml;&micro;&Auml;×&Ouml;·&ucirc;
        If Combo1.SelLength > 0 Then
            isAnySelectedChar = True
            selLen = Combo1.SelLength
            cursorPos = cursorPos - selLen
        Else
            isAnySelectedChar = False
            selLen = 0
        End If
        beforeStr = Combo1.Text
    End Sub
    '&Otilde;&Ograve;&sup3;&ouml;&Iuml;&Acirc;&Ograve;&raquo;&cedil;&ouml;&iquest;&Eacute;&Ograve;&Ocirc;&raquo;&ntilde;&micro;&Atilde;&frac12;&sup1;&micro;&atilde;&micro;&Auml;&iquest;&Oslash;&frac14;&thorn;
    Private Function FindNextControl(ByVal tIndex As Integer) As Control
        Dim obj As Control
        Dim tempIndex As Integer
        Dim tempControl As Control
        
        For Each obj In Me.Controls
            If obj.TabIndex > tIndex Then
                Set tempControl = obj
                Exit For
            End If
            If obj.TabIndex < tempIndex Then
                tempIndex = obj.TabIndex
                Set tempControl = obj
            End If
        Next
        Set FindNextControl = tempControl
    End FunctionPrivate Function FindInsertPos(ByVal bStr As String, ByVal aStr As String) As Integer
        Dim m As Integer
        Dim n As Integer
        Dim j As Integer
        Dim k As Integer
        Dim l As Integer
        
        m = Len(aStr)
        n = Len(bStr)
        k = m
        l = 0    For j = 1 To IIf(m > n, n, m)
            If Left$(aStr, j) <> Left$(bStr, j) Then
                k = j
                Exit For
            End If
        Next
        If Not isKeyBackPressed Then
            For j = k + 1 To m
                If Left$(aStr, j) = Left$(bStr, k + 1) Then
                    l = j - 1
                    Exit For
                End If
            Next
            If l <> 0 Then k = l
        End If
        
        FindInsertPos = k
    End Function
    Private Sub Form_Load()
        Combo1.Clear
        Combo1.AddItem "Apples"
        Combo1.AddItem "Appies"
        Combo1.AddItem "Banana"
        Combo1.AddItem "Bread"
        Combo1.AddItem "Break"
        Combo1.AddItem "Bxuu"
        Combo1.AddItem "Bxv1"
        Combo1.AddItem "Bybb"
        Combo1.AddItem "Bybb"
        Combo1.AddItem "&raquo;&AElig;&Ecirc;&macr;&Egrave;&Euml;"
        Combo1.AddItem "&raquo;&AElig;&sup1;&acirc;&Iuml;&Agrave;"
        Combo1.AddItem "&Agrave;&icirc;&Egrave;&ocirc;&Ecirc;&macr;"
        
    End SubPublic Function GetCaretPos(ByVal hwnd5 As Long, sPos As Long, ePos As Long) As Long
    Dim I As Long
        I = SendMessage(hwnd5, CB_GETEDITSEL, sPos, ePos)
        GetCaretPos = ePos
    End Function
    有些测试代码,请参考