Change listbox width of combo boxes | CodeGuru

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Nov 29, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

.

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

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.