一直保持下拉状态,那不如放在CListBox控件在CComboBox下面,需要的时候显示出来,不需要的时候隐藏

解决方案 »

  1.   

    你好,这个方法我也想过,但是考虑到2个问题没有采用
    1.控件的相互遮挡问题,如果是ComboBox,则下拉条不会被其他控件遮挡,而ListBox会被遮挡,如图所示
    2.Combox的选项在鼠标滑动时就会更改焦点,而ListBox要单击才会更改焦点选项
    总之最好还是用一个ComboBox控件能解决最好,实在没办法再看吧
      

  2.   


    你好,我现在是用Edit、Button、ListBox一起实现,但是碰到个最麻烦的问题:
    1.这个组合的控件的正下方刚好是一个自绘的按钮,按钮类里设定了鼠标滑过时会将焦点设置在按钮上,并且带有按钮外观上的特效
    2.但是我为了模拟组合框的效果,给Edit响应了SETFOCUS消息,在得到焦点时显示List,又给响应了KILLFOCUS消息,让他在失去焦点的时候把List隐藏起来现在就是上面2点冲突了:我单击Edit时候,List出来了,我想去点击List中的项,但是刚好List的项比较多,鼠标移动到下方的时候到达那个自绘按钮的地盘了,于是焦点转移,List消失!!!
    附图一张
    先说明一下,界面的布局不好改动了,已经很紧凑了,所以不能打那个自绘按钮的主意,求助啊各路大神!!
      

  3.   

    你不能在KILLFOUCS里先判断一下当前正在操作哪个窗口吗?如果当前正在操作LISTBOX,就不隐藏啊。
    WindowFormPoint()
      

  4.   

    也不行,不过我是这样做的,
    if(GetFocus() == GetDlgItem(IDC_LIST_HISTORY))
    结果一样,还是在鼠标到自绘按钮的区域的时候LISTBOX就消失了
    后面我发现那个自绘按钮的MouseMove里用了SetCapture和SetFocus,但是如果把这2个去掉,那个自绘按钮又表现不正常了。
    现在我是又用ComboBox来做了,用DropList风格,再重绘,去掉右边的下拉箭头,这样是好的只不过下拉选项在第一次单击Combo的时候才会出现,若要再让 出现就可以移到其他按钮上,再单击Combo
      

  5.   

    我的建议,重写这个ComboBox类:这个ComboBox类继承Dialog,里面有个ListBox,将ListBox显示在这个ComboBox下面,当LButtonDown的时候,显示ListBox,在你想收起的时候,再隐藏这个ListBox,选择完某一个项,再在这个Dialog(ComboBox)上DrawText。至于右边的ComboBox特有的下拉按钮,可以DrawIcon呀。LRESULT CCustomComboBox::OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        bHandled = FALSE;    if (!m_bTracking)
        {
            TRACKMOUSEEVENT stTraceMouseEvent;        stTraceMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
            stTraceMouseEvent.dwFlags = TME_LEAVE;
            stTraceMouseEvent.hwndTrack = m_hWnd;
            stTraceMouseEvent.dwHoverTime = 0;
            if (TrackMouseEvent(&stTraceMouseEvent) && m_uComboBoxState != BUTTONSTATE_PUSHED)
            {
                m_bTracking = TRUE;
                m_uComboBoxState = BUTTONSTATE_HOT;
                ::InvalidateRect(m_hWnd, NULL, FALSE);
            }
        }    return 0;
    }LRESULT CCustomComboBox::OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        bHandled = FALSE;
        m_bTracking = FALSE;    if (m_uComboBoxState != BUTTONSTATE_PUSHED)
        {
            m_uComboBoxState = BUTTONSTATE_NORMAL;
            ::InvalidateRect(m_hWnd, NULL, FALSE);
        }    return 0;
    }LRESULT CCustomComboBox::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        bHandled = FALSE;    if (::IsWindowVisible(m_clstComboBox.m_hWnd) == FALSE)
        {
            m_uComboBoxState = BUTTONSTATE_PUSHED;
            ::ShowWindow(m_clstComboBox.m_hWnd, SW_SHOW);
        }    ::InvalidateRect(m_hWnd, NULL, FALSE);    return 0;
    }LRESULT CCustomComboBox::OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        bHandled = FALSE;    if (m_uComboBoxState != BUTTONSTATE_PUSHED)
        {
            m_uComboBoxState = BUTTONSTATE_HOT;
            ::InvalidateRect(m_hWnd, NULL, FALSE);
        }    return 0;
    }
      

  6.   

    感谢你的回答,你是说相当于在那个地方放一个对话框了,对话框包括一个Combo和一个ListBox那样啊,对话框上放对话框,好像挺麻烦的
      

  7.   

    感谢你的回答,你是说相当于在那个地方放一个对话框了,对话框包括一个Combo和一个ListBox那样啊,对话框上放对话框,好像挺麻烦的感谢你的回答,你是说相当于在那个地方放一个对话框了,对话框包括一个Combo和一个ListBox那样啊,对话框上放对话框,好像挺麻烦的
    不是,是你的自定义的Combo继承dialog(我这WTL的程序,自定义的ComboBox就是继承CWindowImpl的,成员变量里有个ListBox,MFC的话应该差不多),不是将Combo放在Dialog上。如果用Eidt和ListBox组合操控性上有点不方便