ComboBox控件
-
创建控件
// ComboBox控件的创建 // 1.一直显示下拉框,编辑框可输入 HWND hCombo1 = CreateWindowEx(0, TEXT("ComboBox"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | CBS_HASSTRINGS| CBS_SIMPLE, 10, 10, 200, 130, hWnd,(HMENU)1001, hInstance, 0); // 2. 下拉框隐藏,编辑框可输入 HWND hCombo2 = CreateWindowEx(0, TEXT("ComboBox"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | CBS_HASSTRINGS | CBS_DROPDOWN, 10, 140, 200, 130, hWnd, (HMENU)1002, hInstance, 0); // 3. 下拉框隐藏,编辑框不可输入 HWND hCombo3 = CreateWindowEx(0, TEXT("ComboBox"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | CBS_HASSTRINGS | CBS_DROPDOWNLIST, 10, 270, 200, 130, hWnd, (HMENU)1003, hInstance, 0); // 添加测试数据到下拉列表中 const TCHAR* tem[] = { TEXT("tem1"),TEXT("tem2"),TEXT("tem3"),TEXT("tem4") }; for (int i = 0; i < 4; i++) { SendMessage(hCombo1, CB_ADDSTRING, i, (LPARAM)tem[i]); SendMessage(hCombo2, CB_ADDSTRING, i, (LPARAM)tem[i]); SendMessage(hCombo3, CB_ADDSTRING, i, (LPARAM)tem[i]); } |
-
效果展示
-
控件样式
样式 | 说明 |
CBS_AUTOHSCROLL | 当用户在行末尾键入字符时,自动将编辑控件中的文本滚动到右侧。 如果未设置此样式,则仅允许矩形边界内的文本。 |
CBS_DISABLENOSCROLL | 在列表框中显示一个禁用的垂直滚动条,当该框不包含足够的项目滚动时。 如果不使用此样式,则当列表框未包含足够的项时,将会隐藏滚动条。 |
CBS_DROPDOWN | 与CBS_SIMPLE类似,除非用户选择编辑控件旁边的图标,否则不会显示列表框。 |
CBS_DROPDOWNLIST | 与CBS_DROPDOWN类似,除了编辑控件被显示列表框中当前所选内容的静态文本项替换。 |
CBS_HASSTRINGS | 指定所有者绘制组合框包含由字符串组成的项。 组合框维护字符串的内存和地址,以便应用程序可以使用 CB_GETLBTEXT 消息检索特定项的文本。 |
CBS_LOWERCASE | 转换为选定字段和列表中的小写所有文本。 |
CBS_NOINTEGRALHEIGHT | 指定组合框的大小正好是应用程序在创建组合框时指定的大小。 通常,系统调整组合框的大小,使其不显示部分项。 |
CBS_OEMCONVERT | 将组合框编辑控件中输入的文本从Windows字符集转换为 OEM 字符集,然后返回到Windows字符集。 当应用程序调用 CharToOem 函数以将组合框中的Windows字符串转换为 OEM 字符时,这可确保正确转换字符。 此样式最适用于包含文件名的组合框,仅适用于使用CBS_SIMPLE或CBS_DROPDOWN样式创建的组合框。 |
CBS_OWNERDRAWFIXED | 指定列表框的所有者负责绘制其内容,并且列表框中的项目的高度相同。 创建组合框时,所有者窗口会收到 一条WM_MEASUREITEM 消息,当组合框的视觉方面发生更改时,会收到 WM_DRAWITEM 消息。 |
CBS_OWNERDRAWVARIABLE | 指定列表框的所有者负责绘制其内容,并且列表框中的项目高度可变。 当创建组合框时,所有者窗口在组合框中收到一 条WM_MEASUREITEM 消息,并在组合框的视觉方面发生更改时收到 WM_DRAWITEM 消息。 |
CBS_SIMPLE | 随时显示列表框。 列表框中的当前选择显示在编辑控件中。 |
CBS_SORT | 自动对添加到列表框的字符串进行排序。 |
CBS_UPPERCASE | 转换为选定字段和列表中的大写所有文本。 |
-
控件消息
消息码 | 说明 | WPARAM | LPARAM | 返回值 |
CB_GETCOUNT | 获得下拉框中项的总数 | 0 | 0 | Int |
CB_GETCURSEL | 获得当前选中项的索引 | 0 | 0 | Int |
CB_SETCURSEL | 设置当前选中的索引 | nSelect(要选中项的索引) | 0 | int |
CB_GETEDITSEL | 获得编辑框中选中字符的起始位置和结束位置 | 0 | 0 | DWORD(L为起始位置, H为结束位置 |
CB_LIMITTEXT | 限制文本长度 | nMacChars | 0 | BOOL |
CB_SETEDITSEL | 设置编辑框中文本选中位置 | 0 | MAKELPARAM(nStartChar,nEndChar) | BOOL |
CB_GETITEMDATA | 获得指定项的附加数据 | nIndex | 0 | DWORD_PTR |
CB_SETITEMDATA | 设置指定项的附加数据 | nIndex | (LPARAM)DWORD_PTR | Int |
CB_GETLBTEXT | 获得指定项的字符串 | nIndex | (LPARAM)lpszText | Int |
CB_GETLBTEXTLEN | 获得指定项的字符长度 | nIndex | 0 | Int |
CB_SHOWDROPDOWN | 显示下拉框 | (BOOL)bShow | 0 | Void |
CB_ADDSTRING | 添加字符串到下拉列表中 | 0 | (LPARAM)lpszText | Int |
CB_DELETESTRING | 删除指定项 | nIndex | 0 | Int |
CB_INSERTSTRING | 插入字符串项 | nIndex | (LPARAM)lpszText | Int |
CB_RESETCONTENT | 删除所有项 | 0 | 0 | Void |
CB_DIR | 显示指定目录下的文件和文件夹 | (文件属性)DDL_DRIVES, DDL_HIDDEN,等 | 文件目录字符串 | Int |
CB_FINDSTRING | 查找字符串 | 开始索引位置nStartAfter | lpszString,要查找的字符串 | Int |
CB_SELECTSTRING | 查找指定字符串开头的项 | nStartAfter | lpszString | Int |
WM_CLEAR | 清除 | 0 | 0 | Void |
WM_COPY | 复制 | 0 | 0 | Void |
WM_CUT | 剪贴 | 0 | 0 | Void |
WM_PASTE | 粘贴 | 0 | 0 | Void |
-
控件通知消息
ComboBox控件发送WM_COMMAND消息到父窗口
消息ID | 说明 |
CBN_CLOSEUP | 控件下拉框关闭时发送的消息 |
CBN_DBLCLK | 双击列表框中的字符串消息 |
CBN_DROPDOWN | 下拉框显示时消息 |
CBN_EDITCHANGE | 编辑框内容发生改变消息 |
CBN_EDITUPDATE | 编辑框更新显示前消息 |
CBN_ERSPACE | 组合框无法分配内存消息 |
CBN_KILLFOCUS | 失去焦点消息 |
CBN_SELCHANGE | 选中项改变消息 |
CBN_SELENDCANCEL | |
CBN_SETFOCUS | 获得焦点消息 |
WM_DRAWITEM | 控件自给消息 |
-
实例
-
添加数据到下拉列表中
// 添加测试数据到下拉列表中 const TCHAR* tem[] = { TEXT("tem1"),TEXT("tem2"),TEXT("tem3"),TEXT("tem4") }; for (int i = 0; i < 4; i++) { SendMessage(hCombo1, CB_ADDSTRING, i, (LPARAM)tem[i]); SendMessage(hCombo2, CB_ADDSTRING, i, (LPARAM)tem[i]); SendMessage(hCombo3, CB_ADDSTRING, i, (LPARAM)tem[i]); } |
2. 选中项发生改变时获得选中项的字符串数据
// 按钮,菜单,加速键,命令消息,Edit控件通知消息 LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { // 捕获控件id为1001,并且选中项发生改变消息 if (LOWORD(wParam) == 1001 && HIWORD(wParam) == CBN_SELCHANGE) { HWND hCom = (HWND)lParam; // 获得控件句柄 int nSel = SendMessage(hCom, CB_GETCURSEL, 0, 0); // 获得选中项的索引 TCHAR tem[100] = { 0 }; SendMessage(hCom, CB_GETLBTEXT, nSel, (LPARAM)tem); // 获得选中项的字符串 MessageBox(hWnd, tem, TEXT("提示"), MB_OK); } return 0; } |