#visual-c
#visual-c #visual-c
Вопрос:
Я пытаюсь настроить ширину списка со списком на основе максимальной ширины содержимого списка. все возможные способы динамического увеличения / уменьшения ширины списка со списком зависят от максимальной ширины элементов списка.
Комментарии:
1. Какой API / SDK / framework вы используете? MFC, QT, winforms?
2. использование фреймворка mfc
Ответ №1:
Я использовал это:
void SetBestDroppedWidth(CComboBox *pComboBox)
{
// Find the longest string in the combo box.
CString str;
CSize sz;
int dx = 0;
TEXTMETRIC tm;
CDC* pDC = pComboBox->GetDC();
CFont* pFont = pComboBox->GetFont();
// Select the listbox font, save the old font
CFont* pOldFont = pDC->SelectObject(pFont);
// Get the text metrics for avg char width
pDC->GetTextMetrics(amp;tm);
for (int i = 0; i < pComboBox->GetCount(); i )
{
pComboBox->GetLBText(i, str);
sz = pDC->GetTextExtent(str);
// Add the avg width to prevent clipping
sz.cx = tm.tmAveCharWidth;
if (sz.cx > dx)
dx = sz.cx;
}
// Select the old font back into the DC
pDC->SelectObject(pOldFont);
pComboBox->ReleaseDC(pDC);
// Adjust the width for the vertical scroll bar and the left and right border.
dx = ::GetSystemMetrics(SM_CXVSCROLL) 2 * ::GetSystemMetrics(SM_CXEDGE);
// If the width of the list box is too small, adjust it so that every
// item is completely visible.
if (pComboBox->GetDroppedWidth() < dx)
{
pComboBox->SetDroppedWidth(dx);
ASSERT(pComboBox->GetDroppedWidth() == dx);
}
}
Вызовите его после того, как все элементы будут добавлены в combobox:
//CComboBox m_HavingRole; // in header file
for (RoleList::iterator it = rolesObList.begin(); it != rolesObList.end(); it )
{
nItem = m_HavingRole.AddString(it->m_szName);
m_HavingRole.SetItemData(nItem, it->m_lRoleID);
}
SetBestDroppedWidth(amp;m_HavingRole);
Комментарии:
1. Спасибо — Lucian.
2. Это выглядит довольно хорошо. Но вам пришлось бы объяснить, ПОЧЕМУ может быть отсечение и откуда вы знаете, что добавления
tm.tmAveCharWidth
достаточно?