2

我有一个 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?//
    ////////////////////////////////
}
4

1 回答 1

1

如果放置的列表框不够宽,则不要添加水平滚动条并允许滚动,您可以相应地设置放置的列表框的宽度。

代替

m_Combo.SetHorizontalExtent(x);

m_Combo.SetDroppedWidth(x);
于 2012-06-06T20:09:53.097 回答