关于 ComboBoxEx 控件
ComboBoxEx 控件是为项图像提供本机支持的组合框控件。 若要使项图像易于访问,控件提供图像列表支持。 通过使用此控件,可以提供组合框的功能,而无需手动绘制项图形。
本主题包含以下各节:
- 创建 ComboBoxEx 控件
- ComboBoxEx 控件样式
- ComboBoxEx 控件项
- 回调项
- ComboBoxEx 控件图像列表
- 关于 ComboBoxEx 控件通知消息
- ComboBoxEx 控件消息转发
创建 ComboBoxEx 控件
实际上,ComboBoxEx 控件会创建子组合框,并根据分配的图像列表执行所有者绘制任务。 因此,CBS_OWNERDRAWFIXED 样式是隐含的,在创建控件时不需要使用它。 由于图像列表用于提供项图形,因此无法使用 CBS_OWNERDRAWVARIABLE 样式。
必须通过调用 InitCommonControlsEx 函数来初始化 ComboBoxEx 控件,并在随附的 INITCOMMONCONTROLSEX 结构中指定 ICC_USEREX_CLASSES。
可以使用 CreateWindowEx 函数创建 ComboBoxEx 控件,并将 WC_COMBOBOXEX 指定为窗口类。 调用 InitCommonControlsEx 函数时注册该类,如上所述。
在不使用默认图像列表的情况下创建 ComboBoxEx 控件。 若要使用项图像,必须为 ComboBoxEx 控件创建图像列表,并使用 CBEM_SETIMAGELIST 消息将其分配给控件。 如果未将图像列表分配给 ComboBoxEx 控件,则控件仅显示项文本。
ComboBoxEx 控件样式
ComboBoxEx 控件仅支持以下 ComboBox 样式:
- CBS_SIMPLE
- CBS_DROPDOWN
- CBS_DROPDOWNLIST
- WS_CHILD
还有一些 ComboBoxEx 控件扩展样式只能由 ComboBoxEx 使用。
注意
在某些情况下,CBS_SIMPLE 样式可能无法正常工作。
由于 ComboBoxEx 控件根据分配的图像列表执行所有者绘制任务,因此 CBS_OWNERDRAWFIXED 样式是隐式的;创建控件时不需要使用它。 由于图像列表用于提供项图形,因此无法使用 CBS_OWNERDRAWVARIABLE 样式。 ComboBoxEx 控件还支持提供其他功能的 ComboBoxEx 控件扩展样式 。
ComboBoxEx 控件项
ComboBoxEx 控件使用 COMBOBOXEXITEM 结构维护项信息。 此结构包括项索引、图像索引(普通、选择状态和覆盖)、缩进值、文本字符串和项特定的值的成员。
ComboBoxEx 控件通过消息传递轻松访问和操作项。 若要添加或删除项,请发送 CBEM_INSERTITEM 或 CBEM_DELETEITEM 消息。 可以使用 CBEM_SETITEM 消息修改当前在控件中的项。
回调项
ComboBoxEx 控件支持回调项属性。 使用 CBEM_INSERTITEM 将项添加到控件时,可以将项指定为回调项。 将值分配给项的 COMBOBOXEXITEM 结构时,必须指定相应的回调标志值。 以下是 COMBOBOXEXITEM 结构成员及其相应的回调标志值。
成员 | 回调值 |
---|---|
pszText | LPSTR_TEXTCALLBACK |
iImage | I_IMAGECALLBACK |
iSelectedImage | I_IMAGECALLBACK |
iOverlay | I_IMAGECALLBACK |
iIndent | I_INDENTCALLBACK |
该控件将通过发送 CBEN_GETDISPINFO 通知代码来请求有关回调项的信息。 此通知以 WM_NOTIFY 消息的形式发送。 当应用程序处理此消息时,必须为控件提供请求的信息。 如果将随附 COMBOBOXEXITEM 结构的掩码成员设置为 CBEIF_DI_SETITEM,控件将存储项数据,并且不会再次提出请求。
ComboBoxEx 控件图像列表
如果希望 ComboBoxEx 控件显示带有项的图标,则必须提供图像列表。 ComboBoxEx 控件最多支持一个项目的三个图像—一个用于其所选状态,一个用于非选定状态,一个用于覆盖图像。 使用 CBEM_SETIMAGELIST 消息将现有图像列表分配给 ComboBoxEx 控件。
COMBOBOXEXITEM 结构包含表示每个图像列表(已选择、未选择和覆盖)的图像索引的成员。 对于每个项,请将这些成员设置为显示所需的图像。 不需要为每种图像类型指定图像索引。 可以根据需要混合和匹配图像类型,但始终将 COMBOBOXEXITEM 结构的掩码成员设置为指示正在使用哪些成员。 该控件将忽略尚未标记为有效的成员。
注意
如果使用 CBS_SIMPLE 样式,则不显示图标。
关于 ComboBoxEx 控件通知消息
ComboBoxEx 控件发送通知消息以报告自身的更改或请求回调项信息。 控件的父项从 ComboBoxEx 控件中包含的组合框中接收所有 WM_COMMAND 消息。 ComboBoxEx 控件使用 WM_NOTIFY 消息发送自己的通知。 因此,控件的所有者必须准备好处理这两种形式的通知消息。
以下是通过 WM_NOTIFY 消息发送的特定于 ComboBoxEx 的通知代码。
通知 | 描述 |
---|---|
CBEN_BEGINEDIT | 指示用户已激活下拉列表或在控件的编辑框中单击。 |
CBEN_ENDEDIT | 指示用户已从下拉列表中选择某个项或已结束编辑框中的某个编辑操作。 |
CBEN_DELETEITEM | 报告项已删除。 |
CBEN_GETDISPINFO | 请求有关项属性的信息。 |
CBEN_INSERTITEM | 指示在控件中插入了项。 |
ComboBoxEx 控件消息转发
以下是 ComboBoxEx 控件转发到其子组合框的标准组合框消息。 其中一些消息可能由 ComboBoxEx 控件在转发邮件之前或之后进行处理。
- CB_DELETESTRING
- CB_FINDSTRINGEXACT
- CB_GETCOUNT
- CB_GETCURSEL
- CB_GETDROPPEDCONTROLRECT
- CB_GETDROPPEDSTATE
- CB_GETITEMDATA
- CB_GETITEMHEIGHT
- CB_GETLBTEXT
- CB_GETLBTEXTLEN
- CB_GETEXTENDEDUI
- CB_LIMITTEXT
- CB_RESETCONTENT
- CB_SETCURSEL
- CB_SETDROPPEDWIDTH
- CB_SETEXTENDEDUI
- CB_SETITEMDATA
- CB_SETITEMHEIGHT
- CB_SHOWDROPDOWN
以下是 ComboBoxEx 控件转发到其父窗口的窗口消息:
- WM_COMMAND(这包括所有 CBN_ 通知。)
- WM_NOTIFY