组合框功能

本文档讨论组合框的功能。 有关详情,请参阅以下主题:

特殊功能

有一些特殊用途的消息和函数使应用程序能够在组合框中显示目录列表、将数据与组合框中的列表项相关联,以及更改下拉组合框或下拉列表框的键盘界面。

目录列表

应用程序可以通过向组合框发送 CB_DIR 消息,将文件或子目录的名称添加到组合框中。 此消息的 wParam 参数指定要添加的文件的属性,lParam 参数是指向定义文件规范的文本字符串的指针。

可以使用 DlgDirListComboBox 函数替换对话框中组合框的内容。 该函数使用与一组指定条件匹配的驱动器、目录和文件的名称填充组合框。 DlgDirSelectComboBoxEx 函数检索由 DlgDirListComboBox 初始化的组合框中的当前选择。 通过这些函数,用户可以从组合框中选择驱动器、目录或文件,而无需键入文件的位置和名称。

DlgDirListComboBoxDlgDirSelectComboBoxEx 函数以及 CB_DIR 消息类似于列表框使用的 DlgDirListDlgDirSelectEx 函数以及 LB_DIR 消息。

与列表项关联的数据

应用程序可以将数据与组合框中的列表项相关联。 CB_SETITEMDATA 消息将 DWORD 值与列表项相关联,CB_GETITEMDATA 检索与列表项关联的值。

创建所有者绘制的组合框中的示例使用项数据将常量与下拉列表框中的每个项相关联。 此类唯一值标识与其排序位置无关的每个项。

其他应用程序可能使用项数据将句柄或指针与列表项相关联。 如果是这样,应用程序可以在删除列表项时处理 WM_DELETEITEM 消息以删除或释放指定的对象。

扩展用户界面

下拉组合框和下拉列表框支持一个名为扩展用户界面的替代键盘界面。 默认情况下,F4 键打开或关闭列表,向下箭头键将更改当前选择。 但是,在具有扩展用户界面的组合框中,F4 键处于禁用状态,然后按向下箭头键将打开下拉列表。 此外,在设置扩展 UI 时,通常滚动浏览列表中的项的鼠标滚轮没有任何函数。

若要选择组合框的用户界面,应用程序可以将 CB_SETEXTENDEDUI 消息发送到组合框。 wParam 参数的 TRUE 值启用扩展用户界面;FALSE 值设置默认用户界面。 若要确定组合框是否使用扩展用户界面,应用程序可以将 CB_GETEXTENDEDUI 消息发送到组合框。

提示横幅

提示横幅是编辑控件和组合框的新功能。 提示横幅的目的是向用户提供有关编辑控件或组合框的提示。 以下屏幕截图显示带有提示文本“搜索”的编辑控件。

screen shot of an edit control with the cue text

当编辑控件没有文本或组合框没有选择时,将显示提示横幅的文本。 当用户在编辑控件中输入文本或在组合框中做出选择时,提示横幅将消失。 默认情况下,当编辑控件或组合框收到焦点时,提示横幅也会消失。

组合框通知

组合框中的消息以 WM_COMMAND 消息的形式作为通知代码发送。 通知代码存储在 wParam 参数的高位字中,应用程序可以处理以下组合框通知代码。

通知代码 说明
CBN_CLOSEUP 指示下拉组合框或下拉列表框中的列表即将关闭。
CBN_DBLCLK 指示用户已在简单组合框中双击列表项。
CBN_DROPDOWN 指示下拉组合框或下拉列表框中的列表即将打开。
CBN_EDITCHANGE 指示用户已更改简单组合框或下拉组合框的编辑控件中的文本。 此通知代码在显示更改的文本发送。
CBN_EDITUPDATE 指示用户已更改简单组合框或下拉组合框的编辑控件中的文本。 此通知代码在显示更改的文本发送。
CBN_ERRSPACE 指示组合框无法分配足够的内存来执行请求,例如添加列表项。
CBN_KILLFOCUS 指示组合框即将失去输入焦点。
CBN_SELCHANGE 指示当前所选内容已更改。
CBN_SELENDCANCEL 指示在下拉列表中所做的选择(处于下拉状态)应忽略。
CBN_SELENDOK 指示在下拉列表中所做的选择(处于下拉状态)应接受。
CBN_SETFOCUS 指示组合框已收到输入焦点。

 

默认组合框行为

下表描述预定义 COMBOBOX 类窗口过程专门处理的消息。

消息 说明
CB_ADDSTRING LB_ADDSTRING 消息发送到列表窗口以添加列表项。
CB_DELETESTRING LB_DELETESTRING 消息发送到列表窗口以删除列表项。
CB_DIR 将匹配指定属性和路径的文件名添加到列表中。
CB_FINDSTRING LB_FINDSTRING 消息发送到列表窗口。 此消息返回以指定文本开头的第一个列表项的索引。
CB_FINDSTRINGEXACT LB_FINDSTRING 消息发送到列表窗口。 此消息返回与指定文本完全匹配的第一个列表项的索引。
CB_GETCOUNT LB_GETCOUNT 消息发送到列表窗口。 返回列表项数。
CB_GETCURSEL LB_GETCURSEL 消息发送到列表窗口。 返回当前选定项的索引(如果有)。
CB_GETDROPPEDCONTROLRECT 用下拉列表的屏幕坐标填充指定的矩形结构。
CB_GETDROPPEDSTATE 如果下拉列表处于打开状态,则返回 TRUE;否则返回 FALSE
CB_GETDROPPEDWIDTH 返回下拉列表的最小允许宽度(以像素为单位)。
CB_GETEDITSEL EM_GETSEL 消息发送到编辑控件,并返回当前所选内容的起始和结束位置。 在下拉列表框中,窗口过程返回 CB_ERR。
CB_GETEXTENDEDUI 如果组合框是下拉组合框或下拉列表框,并且设置了扩展用户界面标志,则返回 TRUE;否则返回 FALSE
CB_GETHORIZONTALEXTENT LB_GETHORIZONTALEXTENT 消息发送到列表窗口。 返回下拉列表的可滚动宽度(以像素为单位)。
CB_GETITEMDATA LB_GETITEMDATA 消息发送到列表窗口。 返回与指定列表项关联的值。
CB_GETITEMHEIGHT LB_GETITEMHEIGHT 消息发送到列表窗口。 返回指定所有者绘制的列表项的高度(以像素为单位)。
CB_GETLBTEXT LB_GETTEXT 消息发送到列表窗口。 它将指定的列表文本复制到指定的缓冲区。
CB_GETLBTEXTLEN LB_GETTEXTLEN 消息发送到列表窗口。 返回指定列表文本的长度(以 TCHAR 为单位)。
CB_GETLOCALE LB_GETLOCALE 消息发送到列表窗口。 返回列表的当前区域设置。
CB_GETMINVISIBLE 获取组合框的下拉列表中可见项的最小数目。
CB_GETTOPINDEX LB_GETTOPINDEX 消息发送到列表窗口。 返回下拉列表中第一个可见项的索引。
CB_INITSTORAGE LB_INITSTORAGE 消息发送到列表窗口。 它初始化指定项数的空间和项字符串的指定字节数。
CB_INSERTSTRING LB_INSERTSTRING 消息发送到列表窗口。 它将在指定位置插入列表项。
CB_LIMITTEXT EM_LIMITTEXT 消息发送到编辑控件。 它设置用户可以在编辑控件中输入的最大字符数。 在下拉列表框中,窗口过程返回 CB_ERR。
CB_RESETCONTENT LB_RESETCONTENT 消息发送到列表窗口,并删除列表的内容。
CB_SELECTSTRING LB_SELECTSTRING 消息发送到列表窗口。 它选择以指定文本中的字符开头的第一个列表项(如果有)。
CB_SETCURSEL LB_SETCURSEL 消息发送到列表窗口,并设置当前选定内容。
CB_SETDROPPEDWIDTH 设置下拉列表的最小允许宽度(以像素为单位)。
CB_SETEDITSEL EM_SETSEL 消息发送到编辑控件。 它选择指定的文本范围。 在下拉列表框中,窗口过程返回 CB_ERR。
CB_SETEXTENDEDUI 设置或清除扩展用户界面标志。 此标志更改在下拉组合框或下拉列表框中打开和关闭列表的项。 如果组合框是简单的组合框,则窗口过程返回 CB_ERR。
CB_SETHORIZONTALEXTENT LB_SETHORIZONTALEXTENT 消息发送到列表窗口。 它设置下拉列表的可滚动宽度(以像素为单位)。
CB_SETITEMDATA LB_SETITEMDATA 消息发送到列表窗口。 它将指定的值与列表项相关联。
CB_SETITEMHEIGHT LB_SETITEMHEIGHT 消息发送到列表窗口。 它设置指定所有者绘制的列表项或选择字段的高度。
CB_SETLOCALE LB_SETLOCALE 消息发送到列表窗口,并设置列表的当前区域设置。 如果列表具有 CBS_SORT 样式并使用 CB_ADDSTRING 添加字符串,则区域设置会影响列表的排序方式。
CB_SETMINVISIBLE 设置组合框的下拉列表中可见项的最小数目。
CB_SETTOPINDEX LB_SETTOPINDEX 消息发送到列表窗口。 它滚动下拉列表,以便指定项位于可见范围顶部。
CB_SHOWDROPDOWN 显示或隐藏下拉列表。 此消息对简单组合框没有影响。
WM_CHAR 处理字符输入。 在下拉列表框中,此消息将传递到列表窗口,该窗口将所选内容移动到以指定字符开头的第一个项。 在简单和下拉组合框中,此消息将传递给编辑控件。
WM_CLEAR 删除编辑选择。 在简单和下拉组合框中,编辑控件将处理此消息。 在下拉列表框中,窗口过程返回 CB_ERR。
WM_COMMAND 处理来自编辑控件和列表窗口的通知消息,并将相应的组合框通知代码发送到父窗口。
对于编辑控件通知,窗口过程可能会更新列表窗口的当前选择、插入点索引和顶部索引。 对于列表通知消息,窗口过程可能会更新选择字段的内容。
WM_COMPAREITEM 将消息传递到父窗口,使应用程序能够指定两个所有者绘制的列表项的相对排序位置。 组合框窗口从列表窗口接收此消息。
WM_COPY 将编辑选择复制到剪贴板。 在简单和下拉组合框中,编辑控件将处理此消息。 在下拉列表框中,窗口过程返回 CB_ERR。
WM_CREATE 初始化组合框。
WM_CUT 删除编辑选择并将其放置在剪贴板上。 在简单和下拉组合框中,编辑控件将处理此消息。 在下拉列表框中,窗口过程返回 CB_ERR。
WM_DELETEITEM 将消息传递到父窗口,通知应用程序列表项已删除。 组合框窗口从列表窗口接收此消息。
WM_DRAWITEM 将消息传递到父窗口,使应用程序能够绘制指定的列表项。 组合框窗口从列表窗口接收此消息。 窗口过程还可以源自此消息,使应用程序绘制下拉列表框的选择字段。
WM_ENABLE 设置启用或禁止鼠标和键盘输入的状态。
WM_ERASEBKGND 返回 1,指示清除背景。
WM_GETDLGCODE 返回 DLG_WANTCHARS 和 DLGC_WANTARROWS 值的组合。
WM_GETFONT 返回组合框绘制其文本的当前字体的句柄。
WM_GETTEXT 将所选字段的内容复制到指定的缓冲区。 在简单和下拉组合框中,编辑控件将处理此消息。
WM_GETTEXTLENGTH 返回选定字段中文本的长度(以字符为单位)。 在简单和下拉组合框中,编辑控件将处理此消息。
WM_KEYDOWN 处理非字符键盘输入。 在下拉列表框中,此消息将发送到列表窗口,该窗口可能会显示或隐藏自身,或更改其当前选择或插入符号索引。 在简单和下拉组合框中,此消息将传递给编辑控件。 编辑控件将某些键传递到列表窗口,例如向上箭头键和向下箭头键和 F4 键。
WM_KILLFOCUS 根据需要隐藏选定字段中的突出显示并关闭下拉列表。 如果接收输入焦点的窗口是组合框的一部分(例如编辑控件),则忽略此消息。
WM_LBUTTONDBLCLK WM_LBUTTONDOWN 相同。
WM_LBUTTONDOWN 将焦点设置为组合框,对于下拉组合框和下拉列表,可以打开或关闭列表。 如果打开列表,窗口过程将捕获鼠标,以便通过拖动和释放鼠标按钮来启用选择。
WM_LBUTTONUP 如果鼠标打开列表,则释放鼠标捕获。
WM_MEASUREITEM 将消息发布到父窗口,使应用程序能够修改指定的 MEASUREITEMSTRUCT 结构的内容。 组合框窗口从列表窗口接收此消息。
WM_MOUSEMOVE 如果鼠标已打开列表,并且鼠标按钮仍处于关闭状态,请将消息发布到列表窗口。 这样,用户便可以通过将鼠标指针拖动到列表项,然后释放按钮来选择项。
WM_NCCREATE 分配组合框窗口过程使用的内部数据结构。
WM_NCDESTROY 释放为响应 WM_NCCREATE 消息分配的资源。
WM_PAINT 绘制组合框的无效区域。 如果 wParam 不是 NULL,则假定它是从子类函数传递的设备上下文 (DC) 句柄。 窗口过程使用指定的 DC,而不是调用 BeginPaintEndPaint
WM_PASTE 将编辑选择替换为剪贴板的内容。 在简单和下拉组合框中,编辑控件将处理此消息。 在下拉列表框中,窗口过程返回 CB_ERR。
WM_SETFOCUS 将焦点设置为编辑控件,或在下拉列表框中,反转选择字段,并在列表窗口中打开插入符号。
WM_SETFONT 将指定的字体句柄保存在内部结构中,调整所选字段和列表的尺寸,并使组合框窗口失效。 所选字段和列表中的文本以保存的字体显示。
WM_SETREDRAW 设置或清除重绘标志。 如果清除重绘标志,则在再次设置标志之前,不会重新绘制组合框。
WM_SETTEXT 设置编辑控件的内容。 在简单和下拉组合框中,编辑控件将处理此消息。 在下拉列表框中,窗口过程返回 CB_ERR。
WM_SIZE 如有必要,调整子窗口的大小。
WM_SYSKEYDOWN 打开或关闭下拉列表,具体取决于用户按下的箭头键。

 

所有其他消息都将传递到 DefWindowProc 函数进行默认处理。