ListBox控件
1. 创建控件
// 创建ListBox控件 HWND hListBox = CreateWindowEx(0, TEXT("ListBox"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | LBS_HASSTRINGS, 10, 10, 200, 200, hWnd, (HMENU)1001, hInstance, 0); const TCHAR* strArray[] = { TEXT("string1"),TEXT("string2"),TEXT("string3"),TEXT("string4"),TEXT("string5") }; for (int i = 0; i < 5; i++) { SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)strArray[i]); } |
2. 效果展示
3. 控件样式
LBS_COMBOBOX | 通知列表框它是组合框的一部分。 这允许两个控件之间的协调,以便它们呈现统一的 UI。 组合框本身必须设置此样式。 如果样式由组合框之外的任何内容设置,则列表框将错误地视为组合框的子级,并且失败将导致失败。 |
LBS_DISABLENOSCROLL | 当列表框不包含足够的项目滚动时,显示禁用的水平或垂直滚动条。 如果未指定此样式,则当列表框不包含足够的项目时,滚动条将隐藏。 此样式必须与 WS_VSCROLL 或 WS_HSCROLL 样式一起使用。 |
LBS_EXTENDEDSEL | 允许使用 SHIFT 键和鼠标或特殊键组合选择多个项。 |
LBS_HASSTRINGS | 指定列表框包含由字符串组成的项。 列表框维护字符串的内存和地址,以便应用程序可以使用 LB_GETTEXT 消息检索特定项的文本。 默认情况下,除所有者绘制的列表框之外的所有列表框都具有此样式。 可以创建具有或不带此样式的所有者绘制列表框。 |
LBS_MULTICOLUMN | 指定水平滚动的多列列表框。 列表框自动计算列的宽度,或者应用程序可以使用 LB_SETCOLUMNWIDTH 消息设置宽度。 如果列表框具有 LBS_OWNERDRAWFIXED 样式,则当列表框发送 WM_MEASUREITEM 消息时,应用程序可以设置宽度。 |
LBS_MULTIPLESEL | 每次用户单击或双击列表框中的字符串时,都会打开或关闭字符串选择。 用户可以选择任意数量的字符串。 |
LBS_NODATA | 指定无数据列表框。 当列表框中的项数超出一千时,请指定此样式。 无数据列表框还必须具有 LBS_OWNERDRAWFIXED 样式,但不得具有 LBS_SORT 或 LBS_HASSTRINGS 样式。 |
LBS_NOINTEGRALHEIGHT | 指定列表框的大小正好是应用程序在创建列表框时指定的大小。 通常,系统调整列表框的大小,以便列表框不显示部分项。 |
LBS_NOREDRAW | 指定在进行更改时列表框的外观不会更新。 |
LBS_NOSEL | 指定列表框包含可查看但未选中的项目。 |
LBS_NOTIFY | 每当用户单击列表框项 (LBN_SELCHANGE) 时,列表框将通知代码发送到父窗口,双击 (LBN_DBLCLK) 的项目,或取消所选内容 (LBN_SELCANCEL) 。 |
LBS_OWNERDRAWFIXED | 指定列表框的所有者负责绘制其内容,并且列表框中的项目高度相同。 创建列表框时,所有者窗口会收到 WM_MEASUREITEM 消息,当列表框的可视方面发生更改时收到 WM_DRAWITEM 消息。 |
LBS_OWNERDRAWVARIABLE | 指定列表框的所有者负责绘制其内容,并且列表框中的项目高度可变。 创建列表框时,所有者窗口将接收框中每个项目的 WM_MEASUREITEM 消息,当列表框的视觉方面发生更改时,会收到 WM_DRAWITEM 消息。 |
LBS_SORT | 按字母顺序对列表框中的字符串进行排序。 |
LBS_STANDARD | 按字母顺序对列表框中的字符串进行排序。 每当用户单击列表框项、双击项目或取消所选内容时,父窗口都会收到通知代码。 列表框具有垂直滚动条,其边框位于所有侧。 此样式结合了 LBS_NOTIFY、 LBS_SORT、 WS_VSCROLL和 WS_BORDER 样式。 |
LBS_USETABSTOPS | 允许列表框在绘制其字符串时识别和展开制表符。 可以使用 LB_SETTABSTOPS 消息指定制表位位置。 默认选项卡位置相隔 32 个对话框模板单位。 对话框模板单元是对话框模板中使用的与设备无关的单位。 若要将度量值从对话框模板单位转换为屏幕单位 (像素) ,请使用 MapDialogRect 函数。 |
LBS_WANTKEYBOARDINPUT | 指定每当用户按下键且列表框具有输入焦点时,列表框的所有者将接收 WM_VKEYTOITEM 消息。 这使应用程序能够在键盘输入上执行特殊处理。 |
4. 控件消息
消息码 | 说明 | WPARAM | LPARAM | 返回值 |
LB_ADDSTRING | 添加字符串到列表项中 | 0 | LPCTSTR | Int |
LB_DELETESTRING | 删除指定字符串项 | nIndex | 0 | Int |
LB_GETCOUNT | 获得列表项的部数 | 0 | 0 | Int |
LB_GETCURSEL | 获得当前选中项的索引 | 0 | 0 | Int |
LB_GETITEMDATA | 获得指定项的附加数据 | nIndex | 0 | DWORD_PTR |
LB_GETSEL | 获得指定项的选中状态 | nIndex | 0 | int |
LB_GETSELCOUNT | 获得多选项的总数 | 0 | 0 | Int |
LB_GETSELITEMS | 获得选中项的索引数组 | nMaxArray(数组大小) | lpArray(数组) | Int |
LB_GETTEXT | 获得指定项的字符串 | nIndex | LPTSTR | Int |
LB_GETTEXTLEN | 获得指定项字符串长度 | nIndex | 0 | Int |
LB_GETTOPINDEX | 获得第一个可见项的索引 | 0 | 0 | Int |
LB_INSERTSTRING | 插入字符串项 | nIndex | LPCTSTR | Int |
LB_RESETCONTENT | 删除所有的项 | 0 | 0 | Void |
LB_SELITEMRANGE | 范围选择项或取消范围选择 | BOOL(选择=TRUE,取消=FALSE) | DWORD (L=开始选择项的索引, H=结束项的索引) | Int |
LB_SETCARETINDEX | 设置指定项获得焦点,并可见 | nIndex | BOOL(FALSE为完全可见,TRUE为部分可见) | Int |
LB_SETCURSEL | 设置当前选中的字符串项 | nIndex | 0 | Int |
LB_SETITEMDATA | 设置指定项的附加数据 | nIndex | DWORD_PTR | Int |
LB_SETSEL | 设置指定项的选中状态,并获得焦点和可见 | BOOL 为真突出显示,为FALSE取水突出显示 | nIndex | Int |
LB_SETTOPINDEX | 设置指定项为可见项 | nIndex | 0 | Int |
5. 控件通知消息
ComboBox控件发送WM_COMMAND消息到父窗口
消息ID | 说明 |
LBN_DBLCLK | 双击列表框中的字符串消息 |
LBN_ERSPACE | 组合框无法分配内存消息 |
LBN_KILLFOCUS | 失去焦点消息 |
LBN_SELCHANGE | 选中项改变消息 |
LBN_SELCHANCEL | 取消选择项消息 |
LBN_SETFOCUS | 获得焦点消息 |
WM_CTLCOLORLISTBOX | 设置控件背景色和文本颜色 |
WM_VKEYTOITEM | 具有 LBS_WANTKEYBOARDINPUT 样式,发送父窗口可接收WM_KEYDOWN消息 |
6. 实例
1. 添加数据到列表中
// 添加测试数据到列表控件中 const TCHAR* strArray[] = { TEXT("string1"),TEXT("string2"),TEXT("string3"),TEXT("string4"),TEXT("string5") }; for (int i = 0; i < 5; i++) { SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)strArray[i]); } |
2. 在列表控件按回车键获得选中项的字符串数据
- 控件要有LBS_WANTKEYBOARDINPUT样式才有效
- 在控件父窗口上捕获WM_VKEYTOITEM消息,
wParam参数:LOWORD 指定用户按下的键的虚拟键代码。 HIWORD 指定插入点的当前位置。
lParam参数:控件句柄
int MyWnd::OnVKeyToItem(WPARAM wParam, LPARAM lParam) { // 添加消息响应代码 if (LOWORD(wParam) == VK_RETURN) { HWND hListBox = (HWND)lParam; int nSel = SendMessage(hListBox, LB_GETCURSEL, 0, 0); TCHAR tem[10] = { 0 }; SendMessage(hListBox, LB_GETTEXT, nSel, (LPARAM)tem); MessageBox(m_hWnd, tem, TEXT("提示"), MB_OK); } return 0; } |