我有一个C ++ MFC CComboBox(VS 2010),用户可以输入文本并单击“保存”按钮,该按钮将其文本插入下拉列表以供以后调用/使用。当文本对于盒子来说太长时我需要有一个滚动条,所以我在资源文件中设置WS_HSCROLL并使用m_Combo.SetHorizontalExtent(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?//
////////////////////////////////
}
答案 0 :(得分:0)
如果删除的列表框不够宽,您可以相应地设置已删除列表框的宽度,而不是添加水平滚动条并允许滚动。
替换
m_Combo.SetHorizontalExtent(x);
带
m_Combo.SetDroppedWidth(x);