是这样的,我做了一个类似于列表框的用户控件,当点击下拉箭头时,会出现一个"列表"这个列表是另一个窗体.现在的问题是: 当我把这个列表控件放到我的程序中,把下拉列表打开以后,如果此时不点击不用他,而是去点我程序中其他的控件,请问这个列表怎么把他关掉?---
另:我还做了一个类似按钮的控件,怎么才能让他支持焦点?就是出现那个小虚框框!

解决方案 »

  1.   

    这个窗体的Deactive事件中写入代码
      

  2.   

    下一个钩子:'以下在.bas
    Option ExplicitDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
      (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
      (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
      (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
       ByVal wParam As Long, ByVal lParam As Long) As Long Public Const GWL_WNDPROC = (-4)
     Public Const WM_ACTIVATE = &H6
     Public Const WA_ACTIVE = 1
     Public Const WA_CLICKACTIVE = 2
     Public Const WA_INACTIVE = 0
     Public preWinProc As Long Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                             ByVal wParam As Long, ByVal lParam As Long) As Long
     Dim fActive As Integer
     If Msg = WM_ACTIVATE Then
        '取得wParam的LowWord
        fActive = CInt(wParam And &HFFFF)
        If fActive = WA_INACTIVE Then
                 Debug.Print "InActive "
        Else
                 Debug.Print "Active"
        End If
     End If
     '将之送往原来的Window Procedure
     wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
     End Function'以下在form
     Option Explicit
     Private Sub Form_Activate()
     Debug.Print "Event Activate"
     End Sub Private Sub Form_Deactivate()
     Debug.Print "Event DeActivate"
     End Sub Private Sub Form_Load()
     Dim ret As Long
     '记录原本的Window Procedure的位址
     preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
     '设定Combo1的window Procedure到wndproc
     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
     End Sub Private Sub Form_Unload(Cancel As Integer)
     Dim ret As Long
     '取消Message的截取,而使之又只送往原来的Window Procedure
     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
     End Sub
      

  3.   

    是这样的,我做了一个类似于列表框的用户控件,当点击下拉箭头时,会出现一个"列表"这个列表是另一个窗体.现在的问题是: 当我把这个列表控件放到我的程序中,把下拉列表打开以后,如果此时不点击不用他,而是去点我程序中其他的控件,请问这个列表怎么把他关掉?重载usercontrol的失去焦点事件
    当点其他控件的时候,就触发你的控件的lostfocus,这样你怎么处理都行了
      

  4.   

    在lostFocus中加入  YourForm.hide  但前提是:Usercontrol的CanGetFocus属性必须为True否则加再多的代码也无用!!!