使用水平滚动条手动设置MFC CComboBox下拉高度

时间:2012-06-06 19:23:35

标签: c++ drop-down-menu mfc height ccombobox

我有一个C ++ MFC CComboBox(VS 2010),用户可以输入文本并单击“保存”按钮,该按钮将其文本插入下拉列表以供以后调用/使用。当文本对于盒子来说太长时我需要有一个滚动条,所以我在资源文件中设置WS_HSCROLL并使用m_Combo.SetHorizo​​ntalExtent(x),它可以正常工作。

我遇到的问题是,如果有水平滚动条,则会覆盖一条线,并且会出现一个垂直滚动条滚动到该项。我试过了

m_Combo.MoveWindow(&rctDropDown) //rctDropDown was first pulled out and modified
::SetWindowPos() //called after modifying values from ::GetWindowRect()
r.OffsetRect() //where r is from m_Combo.GetDroppedControlRect(&r)

并且可能在过去的几天里更多,但似乎没有任何东西覆盖下拉列表的自动调整大小,而不考虑水平滚动。我是MFC的新手,在绝望的谷歌搜索过程中发现了这些建议。

简而言之,有没有办法覆盖自动高度或扩展它?我知道如何在资源编辑器中调整它的大小,但我想在运行时调整代码大小,似乎一切都被忽略了。以下是我重现错误的测试项目中的函数:

void CtestDlg::StoreClicked()
{
    CString l;
    m_Combo.GetWindowText(l);
    m_Combo.InsertString(0, l);
    m_Combo.SetCurSel(0);
    UpdateList();
}

void CtestDlg::UpdateList()
{
    // Find the longest string in the list box.
    CString     str;
    CSize       sz;
    TEXTMETRIC  tm;
    CDC*        pDC = m_Combo.GetDC();
    CFont*      pFont = m_Combo.GetFont();

    int         x = 0;
    int         y = 0;

    // Select the listbox font, save the old font
    CFont* pOldFont = pDC->SelectObject(pFont);
    // Get the text metrics for avg char width
    pDC->GetTextMetrics(&tm); 

    for(int i = 0; i < m_Combo.GetCount(); i++)
    {
        m_Combo.GetLBText(i, str);
        sz = pDC->GetTextExtent(str);

        // Add the avg width to prevent clipping
        sz.cx += tm.tmMaxCharWidth;

        m_Combo.SetItemHeight(i, sz.cy);

        if (sz.cx > x)
            x = sz.cx;

        y += sz.cy;
    }
    // Select the old font back into the DC
    pDC->SelectObject(pOldFont);
    m_Combo.ReleaseDC(pDC);
    m_Combo.SetHorizontalExtent(x);

    ////////////////////////////////
    //manually change height here?//
    ////////////////////////////////
}

1 个答案:

答案 0 :(得分:0)

如果删除的列表框不够宽,您可以相应地设置已删除列表框的宽度,而不是添加水平滚动条并允许滚动。

替换

m_Combo.SetHorizontalExtent(x);

m_Combo.SetDroppedWidth(x);