// 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]); } |
// 按钮,菜单,加速键,命令消息,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; } |