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