Change listbox width of combo boxes

.

When using combo boxes of type dropdown and droplist, the with of the listbox is
the same as the width of the combobox. In some cases, it may be useful to have the
listbox part wider then the combobox.

To do this, add a handler to WM_CTLCOLOR message to your dialog or to a class
derived from CCombobox and use the following code:

HBRUSH TVisualCombo::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
     HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
     switch (nCtlColor) {
         case CTLCOLOR_EDIT:
         break;
     case CTLCOLOR_LISTBOX:
         if (ListWidth > 0) {
             // New width of a listbox is defined
             CRect rect;
             pWnd->GetWindowRect(&rect);
             if (rect.Width() != ListWidth) {
                 rect.right = rect.left + ListWidth;
                 pWnd->MoveWindow(&rect);
             }
         }
         break;
     }

     // TODO: Return a different brush if the default is not desired
     return hbr;
 }

Using this technique, it is also possible to update a listbox width so that
listbox always shows the complete text of all the listbox items. In order to do this,
you have to scan the listbox items and calculate the text extent (using pDC) and
then update the listbox width so that it is longer then the longest listbox item.

Addenda

My original article regarding the changing of the listbox
width of comboboxes used a WM_CTLCOLOR message. However, Katy
Mulvey
was kind enough (thanks Katy) to point out that the width of the listbox can be
modified with a standard MFC CComboBox class member function.

CComboBox::SetDroppedWidth(int width);

You specify the minimal width with this function. The
actual width is the largest value of the following values:

  • The minimum width (set with previous function).
  • The combobox width.

Last updated: October 2, 1998

More by Author

Must Read