Вручную установите высоту раскрывающегося списка MFC CComboBox с помощью горизонтальной полосы прокрутки
У меня есть C++ MFC CComboBox (VS 2010), в который пользователи могут вводить текст и нажимать кнопку "Сохранить", которая вставляет их текст в раскрывающийся список для последующего вызова / использования. Когда текст слишком длинный для поля, мне нужно иметь полосу прокрутки, поэтому я устанавливаю WS_HSCROLL в файле ресурсов и использую m_Combo.SetHor HorizontalExtent(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 и нашел их в Интернете во время отчаянных поисков Google.
Короче говоря, есть ли способ переопределить автоматическую высоту или увеличить ее? Я знаю, как изменить его размер в редакторе ресурсов, но я хочу изменить размер кода во время выполнения, и все, кажется, игнорируется. Вот мои функции из тестового проекта, который воспроизвел ошибку:
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 ответ
Вместо того, чтобы добавлять горизонтальную полосу прокрутки и разрешать прокрутку, если выпадающий список недостаточно широк, вы можете просто установить ширину выпадающего списка соответствующим образом.
замещать
m_Combo.SetHorizontalExtent(x);
с
m_Combo.SetDroppedWidth(x);