есть ли способ динамически настраивать ширину списка со списком в vc

#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 достаточно?