用TextBox实现组合框中的文本,用窗体实现下拉框,下拉框中的列表用TreeView实现
现在的问题的,怎样让列表框在控件失去焦点时自动收起来(隐藏)我的做法是
1、在窗体(下拉框)活动时SetCapture TreeView.hwnd,让TreeView处理所有鼠标事件
2、处理TreeView_MouseDown事件,当在列表框外点击鼠标时,隐藏列表这种方法在TreeView没有滚动条时是有效的,但在TreeView出现滚动条时就不行了,当点击了滚动条后TreeView不再拥有处理鼠标事件的优先权,所以在点击了滚动条后,列表框不能自动隐藏请教各位,你们在做下拉列表框(组合框)用类似控件时是怎样处理的呢
请大家多发表意见,如果问题得到解决,因为是困扰多时的问题,我会另开帖加分

解决方案 »

  1.   

    你能具体说你的意思吗?是用一个窗体上面放上TreeView和滚动条专门来作列表框,然后从另一个画面调用吗?如果是,在Form_LostFocus里不能写事件吗?我以前做过一个类似的,是将TreeView和滚动条放到PICTURE控件中,在PICTURE控件写事件.不知道对你有帮助没.
      

  2.   

    to zmcpu(CPU)
    谢谢你的回答
    当控件用在模态窗体中时,用来做列表的窗体只能用模态窗体,所以Form_LostFocus不能达到效果
    用PICTURE做列表框,我还没有做过,可能要用到SetParent API函数吧,还请多做说明,关键也是在自动隐藏的实现
    还有,另外加一个滚动条是一个好办法,但在WinXP下面,自己加的滚动条很不好看,和XP的滚动条不一样。
      

  3.   

    用子类可以做到需要的话留下邮箱.我写个DEMO给你.可能的话再顺便给我点分.我这号刚注册,想弄点分分来花.哈哈.
      

  4.   

    可以用子类截获WM_NCACTIVATE消息,当WM_NCACTIVATE发生()时关闭窗口Private Sub mclsSubClass_OnMessage(ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long, bCancel As Boolean)
        
        Err.Clear
        On Error Resume Next
        Select Case uMsg
            Case WM_NCACTIVATE
                If wParam = WA_INACTIVE Then
                    Unload Me
                End If
            Case WM_ACTIVATE
                If wParam = WA_INACTIVE Then
                    Unload Me
                End If
            Case Else
        End Select
    End Sub
      

  5.   

    用GetWindowRece取得TreeView的Rect
    用GetClientRect取得TreeView的客户区Rect(不包含滚动条)这样就可以判断是否点击了滚动条