Combo Box Features

This document discusses features of the combo box. For more information, see the following topics:

Special Features

There are special-purpose messages and functions that enable an application to display a directory listing in a combo box, associate data with list items in a combo box, and change the keyboard interface for a drop-down combo box or drop-down list box.

Directory Lists

An application can add the names of files or subdirectories to a combo box by sending the CB_DIR message to it. The wParam parameter for this message specifies the attributes of the files to add, and the lParam parameter is a pointer to the text string that defines the file specification.

You can use the DlgDirListComboBox function to replace the contents of a combo box in a dialog box. The function fills the combo box with the names of drives, directories, and files that match a specified set of criteria. The DlgDirSelectComboBoxEx function retrieves the current selection in a combo box initialized by DlgDirListComboBox. These functions make it possible for the user to select a drive, directory, or file from a combo box without typing the location and name of the file.

The DlgDirListComboBox and DlgDirSelectComboBoxEx functions and the CB_DIR message are similar to the DlgDirList and DlgDirSelectEx functions and the LB_DIR message used with list boxes.

Data Associated with List Items

An application can associate data with the list items in a combo box. The CB_SETITEMDATA message associates a DWORD value with a list item, and the CB_GETITEMDATA retrieves the value associated with a list item.

The example in Creating an Owner Drawn Combo Box uses item data to associate a constant with each item in a drop-down list box. Such a unique value identifies each item independent of its sorted position.

Other applications might use item data to associate a handle or pointer with a list item. If so, an application can process a WM_DELETEITEM message to delete or free the specified object when the list item is deleted.

The Extended User Interface

Drop-down combo boxes and drop-down list boxes support an alternative keyboard interface called the extended user interface. By default, the F4 key opens or closes the list, and the DOWN ARROW changes the current selection. In a combo box with the extended user interface, however, the F4 key is disabled and pressing the DOWN ARROW key opens the drop-down list. In addition, the mouse wheel, which normally scrolls through the items in the list, does not have any function when the extended UI is set.

To select the user interface for a combo box, an application can send the CB_SETEXTENDEDUI message to the combo box. A TRUE value for the wParam parameter enables the extended user interface; a FALSE value sets the default user interface. To determine whether a combo box uses the extended user interface, an application can send the CB_GETEXTENDEDUI message to the combo box.

Cue Banners

Cue banners are a new feature of edit controls and combo boxes. The purpose of a cue banner is to provide a hint to the user as to the purpose of an edit control or combo box. The following screen shot shows an edit control with the cue text "Search".

screen shot of an edit control with the cue text "search"

The text of a cue banner is displayed when an edit control has no text or a combo box has no selection. When the user enters text into the edit control or makes a selection in a combo box, the cue banner disappears. By default, the cue banner also disappears when the edit control or combo box receives focus.

Combo Box Notifications

Messages from combo boxes are sent as notification codes in the form of WM_COMMAND messages. The notification code is stored in the high word of the wParam parameter, and an application can process the following combo box notification codes.

Notification code Description
CBN_CLOSEUP Indicates the list in a drop-down combo box or drop-down list box is about to close.
CBN_DBLCLK Indicates the user has double-clicked a list item in a simple combo box.
CBN_DROPDOWN Indicates the list in a drop-down combo box or drop-down list box is about to open.
CBN_EDITCHANGE Indicates the user has changed the text in the edit control of a simple or drop-down combo box. This notification code is sent after the altered text is displayed.
CBN_EDITUPDATE Indicates the user has changed the text in the edit control of a simple or drop-down combo box. This notification code is sent before the altered text is displayed.
CBN_ERRSPACE Indicates the combo box cannot allocate enough memory to carry out a request, such as adding a list item.
CBN_KILLFOCUS Indicates the combo box is about to lose the input focus.
CBN_SELCHANGE Indicates the current selection has changed.
CBN_SELENDCANCEL Indicates that the selection made in the drop down list, while it was dropped down, should be ignored.
CBN_SELENDOK Indicates that the selection made drop down list, while it was dropped down, should be accepted.
CBN_SETFOCUS Indicates the combo box has received the input focus.

 

Default Combo Box Behavior

This following table describes the messages specifically handled by the predefined COMBOBOX class window procedure.

Message Description
CB_ADDSTRING Sends an LB_ADDSTRING message to the list window to add a list item.
CB_DELETESTRING Sends an LB_DELETESTRING message to the list window to delete a list item.
CB_DIR Adds the file names matching the specified attributes and path to the list.
CB_FINDSTRING Sends an LB_FINDSTRING message to the list window. This message returns the index of the first list item that begins with the specified text.
CB_FINDSTRINGEXACT Sends an LB_FINDSTRING message to the list window. This message returns the index of the first list item exactly matching the specified text.
CB_GETCOUNT Sends an LB_GETCOUNT message to the list window. It returns the number of list items.
CB_GETCURSEL Sends an LB_GETCURSEL message to the list window. It returns the index of the currently selected item, if any.
CB_GETDROPPEDCONTROLRECT Fills the specified rectangle structure with the screen coordinates of a drop-down list.
CB_GETDROPPEDSTATE Returns TRUE if a drop-down list is open; otherwise, it returns FALSE.
CB_GETDROPPEDWIDTH Returns the minimum allowable width, in pixels, of the drop-down list.
CB_GETEDITSEL Sends an EM_GETSEL message to the edit control, and it returns the starting and ending position of the current selection. In drop-down list boxes, the window procedure returns CB_ERR.
CB_GETEXTENDEDUI Returns TRUE if the combo box is a drop-down combo box or drop-down list box and the extend user-interface flag is set; otherwise, it returns FALSE.
CB_GETHORIZONTALEXTENT Sends an LB_GETHORIZONTALEXTENT message to the list window. It returns the scrollable width, in pixels, of the drop-down list.
CB_GETITEMDATA Sends an LB_GETITEMDATA message to the list window. It returns the value associated with the specified list item.
CB_GETITEMHEIGHT Sends an LB_GETITEMHEIGHT message to the list window. It returns the height, in pixels, of the specified owner-drawn list item.
CB_GETLBTEXT Sends an LB_GETTEXT message to the list window. It copies the specified list text to the specified buffer.
CB_GETLBTEXTLEN Sends an LB_GETTEXTLEN message to the list window. It returns the length, in TCHARs, of the specified list text.
CB_GETLOCALE Sends an LB_GETLOCALE message to the list window. It returns the current locale for the list.
CB_GETMINVISIBLE Gets the minimum number of visible items in the drop-down list of a combo box.
CB_GETTOPINDEX Sends an LB_GETTOPINDEX message to the list window. It returns the index of the first visible item in the drop-down list.
CB_INITSTORAGE Sends an LB_INITSTORAGE message to the list window. It initializes space for the specified number of items and the specified number of bytes for item strings.
CB_INSERTSTRING Sends an LB_INSERTSTRING message to the list window. It inserts a list item at the specified position.
CB_LIMITTEXT Sends an EM_LIMITTEXT message to the edit control. It sets the maximum number of characters a user can enter in the edit control. In drop-down list boxes, the window procedure returns CB_ERR.
CB_RESETCONTENT Sends an LB_RESETCONTENT message to the list window, and it removes the contents of the list.
CB_SELECTSTRING Sends an LB_SELECTSTRING message to the list window. It selects the first list item, if any, that begins with the characters in the specified text.
CB_SETCURSEL Sends an LB_SETCURSEL message to the list window, and it sets the current selection.
CB_SETDROPPEDWIDTH Sets the minimum allowable width, in pixels, of the drop down list.
CB_SETEDITSEL Sends an EM_SETSEL message to the edit control. It selects the specified range of text. In drop-down list boxes, the window procedure returns CB_ERR.
CB_SETEXTENDEDUI Sets or clears the extended user-interface flag. This flag changes the keys that open and close the list in a drop-down combo box or drop-down list box. If the combo box is a simple combo box, the window procedure returns CB_ERR.
CB_SETHORIZONTALEXTENT Sends an LB_SETHORIZONTALEXTENT message to the list window. It sets the scrollable width, in pixels, of the drop down list.
CB_SETITEMDATA Sends an LB_SETITEMDATA message to the list window. It associates the specified value with a list item.
CB_SETITEMHEIGHT Sends an LB_SETITEMHEIGHT message to the list window. It sets the height of the specified owner-drawn list item or the selection field.
CB_SETLOCALE Sends an LB_SETLOCALE message to the list window, and it sets the current locale for the list. The locale affects how the list is sorted if it has the CBS_SORT style and strings are added using CB_ADDSTRING.
CB_SETMINVISIBLE Sets the minimum number of visible items in the drop-down list of a combo box.
CB_SETTOPINDEX Sends an LB_SETTOPINDEX message to the list window. It scrolls the drop-down list so the specified item is at the top of the visible range.
CB_SHOWDROPDOWN Shows or hides the drop-down list. This message has no effect on simple combo boxes.
WM_CHAR Processes character input. In drop-down list boxes, this message is passed to the list window, which moves the selection to the first item beginning with the specified character. In simple and drop-down combo boxes, this message is passed to the edit control.
WM_CLEAR Deletes the edit selection. In simple and drop-down combo boxes, the edit control processes this message. In drop-down list boxes, the window procedure returns CB_ERR.
WM_COMMAND Processes notification messages from the edit control and list window and sends corresponding combo box notification codes to the parent window.
For edit control notifications, the window procedure may update the list window's current selection, caret index, and top index. For list notification messages, the window procedure may update the content of the selection field.
WM_COMPAREITEM Passes the message to the parent window, enabling the application to specify the relative sort position of two owner-drawn list items. The combo box window receives this message from the list window.
WM_COPY Copies the edit selection to the clipboard. In simple and drop-down combo boxes, the edit control processes this message. In drop-down list boxes, the window procedure returns CB_ERR.
WM_CREATE Initializes the combo box.
WM_CUT Deletes the edit selection and places it on the clipboard. In simple and drop-down combo boxes, the edit control processes this message. In drop-down list boxes, the window procedure returns CB_ERR.
WM_DELETEITEM Passes the message to the parent window, notifying the application that a list item has been deleted. The combo box window receives this message from the list window.
WM_DRAWITEM Passes the message on to the parent window enabling the application to paint the specified list item. The combo box window receives this message from the list window. The window procedure can also originate this message to have the application paint the selection field of a drop-down list box.
WM_ENABLE Sets the state to enable or prohibit mouse and keyboard input.
WM_ERASEBKGND Returns 1, indicating that the background is erased.
WM_GETDLGCODE Returns a combination of the DLG_WANTCHARS and DLGC_WANTARROWS values.
WM_GETFONT Returns the handle to the current font with which the combo box will draw its text.
WM_GETTEXT Copies the contents of the selection field to the specified buffer. In simple and drop-down combo boxes, the edit control processes this message.
WM_GETTEXTLENGTH Returns the length, in characters, of the text in the selection field. In simple and drop-down combo boxes, the edit control processes this message.
WM_KEYDOWN Processes noncharacter keyboard input. In drop-down list boxes, this message is sent to the list window, which may show or hide itself, or change its current selection or caret index. In simple and drop-down combo boxes, this message is passed to the edit control. The edit control passes certain keys to the list window, such as the UP and DOWN ARROW keys and the F4 key.
WM_KILLFOCUS Hides the highlight in the selection field and closes the drop-down list, if necessary. If the window receiving the input focus is part of the combo box (for example, the edit control), this message is ignored.
WM_LBUTTONDBLCLK Same as WM_LBUTTONDOWN.
WM_LBUTTONDOWN Sets the focus to the combo box and, for drop-down combo boxes and drop-down lists, can open or close the list. If it opens the list, the window procedure captures the mouse to enable selection by dragging and releasing the mouse button.
WM_LBUTTONUP Releases the mouse capture if the mouse opened the list.
WM_MEASUREITEM Posts the message to the parent window, enabling the application to modify the contents of the specified MEASUREITEMSTRUCT structure. The combo box window receives this message from the list window.
WM_MOUSEMOVE Posts the message to the list window if the mouse has opened the list and the mouse button is still down. This enables a user to select an item by dragging the mouse pointer to a list item and then releasing the button.
WM_NCCREATE Allocates an internal data structure used by the combo box window procedure.
WM_NCDESTROY Frees resources allocated in response to the WM_NCCREATE message.
WM_PAINT Paints the invalid region of the combo box. If wParam is not NULL, it is assumed to be a device context (DC) handle passed from a subclass function. The window procedure uses the specified DC instead of calling BeginPaint and EndPaint.
WM_PASTE Replaces the edit selection with the contents of the clipboard. In simple and drop-down combo boxes, the edit control processes this message. In drop-down list boxes, the window procedure returns CB_ERR.
WM_SETFOCUS Sets the focus to the edit control or, in drop-down list boxes, inverts the selection field and turns on the caret in the list window.
WM_SETFONT Saves the specified font handle in an internal structure, adjusts the dimensions of the selection field and list, and invalidates the combo box window. Text in the selection field and the list is displayed in the saved font.
WM_SETREDRAW Sets or clears the redraw flag. If the redraw flag is cleared, the combo box is not repainted until the flag is set again.
WM_SETTEXT Sets the contents of the edit control. In simple and drop-down combo boxes, the edit control processes this message. In drop-down list boxes, the window procedure returns CB_ERR.
WM_SIZE Resizes the child windows, if necessary.
WM_SYSKEYDOWN Opens or closes the drop-down list depending on which arrow key the user pressed.

 

All other messages are passed to the DefWindowProc function for default processing.