1. 在DropDown时列表显示数据
如果选择一项则触发Click事件
如果没选择触发什么呀,怎么判断没有选择呢??2.实际我要实现的功能如下
我的界面放的combobox控件宽度不能太大,我想在DropDown时宽度加大,click后宽度还原。但是如果没有选择即没有Click时,没有事件发生,我怎么才能还原呢

解决方案 »

  1.   

    在combobox的LostFocus事件里调用click事件,写了个简单例子:Dim OldWidth As SinglePrivate Sub Combo1_Click()
        Combo1.Width = OldWidth
    End SubPrivate Sub Combo1_DropDown()
        Combo1.Width = OldWidth + 200
    End SubPrivate Sub Combo1_LostFocus()
        Call Combo1_Click
    End SubPrivate Sub Form_Load()
        OldWidth = Combo1.Width
    End Sub^_^
      

  2.   

    谢谢一楼的,关键是我不想在lostFocus 时还原,现在就是要在Click后还原,即使没有选择没有发生click事件也要立即还原
      

  3.   

    你click后 把焦点给别的控件不就行了 othercontrol.setfocus
      

  4.   

    kkkksunday(我是猪小弟)我不选择根本就不触发Click事件呀,怎么能把焦点给别的控件如果触发Click事件还用这么费劲吗?看来100分给不出去了
      

  5.   

    问题在于点击 combobox 的 textbox 部分可以使下拉列表回缩,但并不触发它的 click 事件。看来只有用 Mouse 钩子了。
      

  6.   

    of123() 能不能说的详细点
    Mouse 钩子是什么??谢谢
      

  7.   

    '下面的程序我测试过,能解决你的问题.Option ExplicitPublic Const GWL_WNDPROC = (-4)
    Public Const CBN_CLOSEUP = 8
    Public Const WM_COMMAND = &H111Declare 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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long    If Msg = WM_COMMAND And wParam \ 65536 = CBN_CLOSEUP Then
            If lParam = Form1.Combo1.hWnd Then
                Form1.List1.AddItem "Combo1被收起来了"
            ElseIf lParam = Form1.Combo2.hWnd Then
                Form1.List1.AddItem "Combo2被收起来了"
            End If
        End If
        
        WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
    End FunctionForm代码定义:
    Private Sub Combo1_DropDown()
        List1.AddItem "Combo1被拉下来了"
    End SubPrivate Sub Combo2_DropDown()
        List1.AddItem "Combo2被拉下来了"
    End SubPrivate Sub Form_Load()
        prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
        SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
    End Sub
      

  8.   

    子类检测closeup,和dropdown事件,DragonFly_1976(龙飞)应该没错
      

  9.   

    用Microsoft Form 2.0中的ComboBox吧。
      

  10.   

    1.
    当ComboBox收起来的时候会向父窗口发送CBN_CLOSEUP通知消息
    但VB没有映射成事件2.
    发送CB_SETDROPPEDWIDTH改变下拉部分的宽度call sendmessage(combo1.hwnd,CB_SETDROPPEDWIDTH, 像素宽度, byval 0&)CB_SETDROPPEDWIDTH
    An application sends the CB_SETDROPPEDWIDTH message to set the maximum allowable width, in pixels, of the list box of a combo box with the CBS_DROPDOWN or CBS_DROPDOWNLIST style. CB_SETDROPPEDWIDTH 
    wParam = (WPARAM) wWidth,     // width of list box, in pixels 
    lParam = 0,                   // not used, must be zero 
     
    Parameters
    wWidth 
    Specifies the width of the list box, in pixels. 
    Return Values
    If the message is successful, The return value is the new width of the list box. If the message fails, the return value is CB_ERR.Res
    By default, the minimum allowable width of the drop-zdown list box is 0. The width of the list box is either the minimum allowable width or the combo box width, whichever is larger.QuickInfo
      Windows NT: Requires version 4.0 or later.
      Windows: Requires Windows 95 or later.
      Windows CE: Requires version 1.0 or later.
      Header: Declared in winuser.h.
      

  11.   

    DragonFly_1976(龙飞)不行,一运行整个VB都退出了 zyl910(910:分儿,我又来了!) 看的不太明白,我水平低,能不能解释一下
      

  12.   

    //DragonFly_1976(龙飞)不行,一运行整个VB都退出了应该不会你把“Form代码定义:”以上的代码都要放到一个模块中,另外,你程序中的combobox要直接放到窗体中,不能放到容器控件里(放到容器控件里的话,代码要做相应修改)
      

  13.   

    zyl910(910:分儿,我又来了!) 的意思是让你改变combobox下拉列表的宽度,而不是combobox自身的宽度
      

  14.   

    To:rainstormmaster(暴风雨 v2.0) zyl910(910:分儿,我又来了!) 的意思是让你改变combobox下拉列表的宽度,而不是combobox自身的宽度他是怎么改变的?看不懂,详细解释一下或举个例子,好吗?谢谢
      

  15.   

    你把“Form代码定义:”以上的代码都要放到一个模块中,另外,你程序中的combobox要直接放到窗体中,不能放到容器控件里(放到容器控件里的话,代码要做相应修改)
    放到容器控件怎么改?没怎么用过API,看来要好好补习一下
      

  16.   

    不过,就你的问题而言,CBN_CLOSEUP通知消息尽管可以解决你的问题,不过并不能区分是什么原因导致下拉列表收起,原因是,只要列表收起就会发出这条通知消息,不管你是否单击了列表中的某个条目,如果你想区分的话就处理CBN_SELENDCANCEL和CBN_SELENDOK 这两条通知消息:
    一个窗体,一个模块:
    模块代码:
    Option Explicit
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_COMMAND = &H111
    Public Const CBN_SELENDCANCEL = 10
    Public Const CBN_SELENDOK = 9
    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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long    If Msg = WM_COMMAND And wParam \ 65536 = CBN_SELENDCANCEL Then
            If lParam = Form1.Combo1.hWnd Then
                Debug.Print "没有选择任何条目,Combo1的下拉列表就被收起来了"
            ElseIf lParam = Form1.Combo2.hWnd Then
                Debug.Print "没有选择任何条目,Combo2的下拉列表就被收起来了"
            End If
         ElseIf Msg = WM_COMMAND And wParam \ 65536 = CBN_SELENDOK Then
            If lParam = Form1.Combo1.hWnd Then
                Debug.Print "选择了某个条目,导致Combo1的下拉列表被收起来"
            ElseIf lParam = Form1.Combo2.hWnd Then
                Debug.Print "选择了某个条目,导致Combo2的下拉列表被收起来"
            End If
        End If
        
        WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
    End Function窗体上有两个combobox控件:
    Option ExplicitPrivate Sub Form_Load()
        Dim i As Long
        For i = 1 To 20
            Me.Combo1.AddItem ("line " + CStr(i))
            Me.Combo2.AddItem ("test " + CStr(i))
        Next
        prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
        SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
    End Sub
      

  17.   

    //他是怎么改变的?看不懂,详细解释一下或举个例子,好吗?谢谢他不是告诉你了么?
    这样:
    call sendmessage(combo1.hwnd,CB_SETDROPPEDWIDTH, 像素宽度, byval 0&)
    声明你自己添加
      

  18.   

    //放到容器控件怎么改?没怎么用过API,看来要好好补习一下把GetWindowLong 和SetWindowLong中 Me.hWnd改为combobox容器控件的句柄
      

  19.   

    rainstormmaster(暴风雨 v2.0) 在吗?
      

  20.   


    哪里有这些API的详细学习资料,我要好好学习
    call sendmessage(combo1.hwnd,CB_SETDROPPEDWIDTH, 像素宽度, byval 0&)
    CB_SETDROPPEDWIDTH 给它赋什么值,是改变后的宽度吗?像素宽度指的是什么?我怎么试了一下没反应?
      

  21.   

    CB_SETDROPPEDWIDTH 是一个常数:
    CB_SETDROPPEDWIDTH = &H160还是给你个例子吧:Private Declare Function SendMessage Lib _
        "USER32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal Msg As Long, _
        ByVal wParam As Long, ByVal lParam As _
        Long) As Long
    Private Const CB_GETDROPPEDWIDTH = &H15F
    Private Const CB_SETDROPPEDWIDTH = &H160
    Private Const CB_ERR = -1
    函数:
    ' 取得 Combo 下拉的宽度
    ' 可以利用该函数比例放大或缩小宽度
    Public Function GetDropdownWidth(cboHwnd As Long) As Long
        Dim lRetVal As Long
        lRetVal = SendMessage(cboHwnd, CB_GETDROPPEDWIDTH, 0, 0)
        If lRetVal <> CB_ERR Then
            GetDropdownWidth = lRetVal
            '单位为 pixels
        Else
            GetDropdownWidth = 0
        End If
    End Function
    '设置 Combo 下拉的宽度
    '单位为 pixels
    Public Function SetDropdownWidth(cboHwnd As _
        Long, NewWidthPixel As Long) As Boolean
        Dim lRetVal As Long
        lRetVal = SendMessage(cboHwnd, _
            CB_SETDROPPEDWIDTH, NewWidthPixel, 0)
        If lRetVal <> CB_ERR Then
            SetDropdownWidth = True
        Else
            SetDropdownWidth = False
        End If
    End FunctionPrivate Sub Form_Load()
        Dim i As Long
        For i = 1 To 20
            Combo1.AddItem "line " + CStr(i)
        Next
        Dim mwidth As Long
        mwidth = GetDropdownWidth(Combo1.hwnd)
        SetDropdownWidth Combo1.hwnd, mwidth + 100
    End Sub
      

  22.   

    谢谢各位了我一定鼎立支持CSDN,像各位兄弟们学习向雷锋学习
      

  23.   

    这些API的知识在哪能学得到呀,以前也看过一点,但好像没这么详细
    像CB_SETDROPPEDWIDTH这些常数不知道哪里能有说明?
      

  24.   

    这些API的知识在哪能学得到呀,以前也看过一点,但好像没这么详细
    像CB_SETDROPPEDWIDTH这些常数不知道哪里能有说明?
    --------------------------------1.狂买书
    2.狂上编程论坛
    3.狂下载代码,分析代码的实现原理
    4.有事没事翻MSDN
    MSDN关于ComboBox的资料:Visual Studio 6.0(包含VB6)的MSDN:
    平台SDK
    User Interface Services
    Controls
    Combo Boxs-- zyl910公告(2004/8/28) ---------昨天突然打雷下雨
    导致计算机突然断电
    我那时正在上网今天雨才停
    拨号一看
    “没有拨号音”我在家里翻箱倒柜
    总算找到一个Modem了
    可惜是14.4kbps的
    上网速度很不爽所以这几天可能不会上网了
    (再过几天就开学了)