老规矩,先上MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/bb775792(v=vs.85).aspx
其实还是子窗口,static那节说的很明白了,就不重复了 ,这个控件的类名是COMBOBOX
还是以我的博客“窗口详解”(地址:http://blog.csdn.net/zuishikonghuan/article/details/46378475)中的代码为基础,继续编写
样式:
Combo Box分为3种:
1。Simple
风格为:CBS_SIMPLE
Displays the list at all times, and shows the selected item in an edit control.
总是显示一个列表,并在一个edit control(自带)中显示选中项
2。Drop-down
风格为:CBS_DROPDOWN
Displays the list when the icon is clicked, and shows the selected item in an edit control.
当下拉被单击时显示列表,并显示选中一项时,那么在edit control(自带的)里面显示这一项(用户可以编辑edit里的内容)
3。Drop-down list (drop list)
风格为:CBS_DROPDOWNLIST
Displays the list when the icon is clicked, and shows the selected item in a static control.
当下拉被单击时显示列表,并显示选中一项时,那么在static control(自带的)里面显示这一项。
对于这三种样式,详见下图(图片来自MSDN):
其他重要样式:
4。CBS_AUTOHSCROLL
当用户键入编辑框中的字符在行末尾时自动滚动到右边。如果不设置此样式,则只允许适合矩形的边界内的文本。
5。CBS_DISABLENOSCROLL
当列表框中不包含足够要滚动的项目时显示禁用的(灰色)垂直滚动条 。没有这种风格,列表框中不包含足够多的条目时隐藏滚动条。
6。CBS_NOINTEGRALHEIGHT
指定组合框的大小是完全它创建组合框时由应用程序指定的大小。如果不包含此样式,由系统调整组合框大小。
7。CBS_SORT
自动排序
控制消息:
1。CB_ADDSTRING 增加一项
wParam:不需要
lParam:指向要添加的字符串指针
返回值:成功返回从0开始记的序号,失败返回CB_ERR或CB_ERRSPACE
2。CB_DELETESTRING 删除一项
wParam:从0开始计,要删除的项目序号
lParam:不需要
返回值:列表中剩余的计数。如果wParam指定的索引大于项目的数量,则返回值是 CB_ERR。
3。CB_GETCOUNT 获取项目数
wParam:不需要
lParam:不需要
返回值:列表的计数。错误返回 CB_ERR。
4。CB_GETCURSEL 获取当前位置
wParam:不需要
lParam:不需要
返回值:从0开始计,当前选择项目的位置。错误返回 CB_ERR。
5。CB_SETCURSEL 设置当前位置
wParam:从0开始计,指定要设置的项目序号,如果为-1,则清除当前选择并清除edit中的内容
lParam:不需要
返回值: 如果成功,返回值是选定项的索引。如果 wParam 参数大于列表中的项目数目,则返回值是 CB_ERR。如果是-1,则为被清除的所选项目。
6。CB_LIMITTEXT 限制用户可以在组合框的编辑控件中输入的最大文本长度
wParam:用户不可以输入的最大数目(包括字符串终止\0字符)。如果此参数为零,文本长度是限于 0x7FFFFFFE 个字符。
lParam:不需要
返回值:总是TRUE
7。CB_GETLBTEXTLEN 获取指定项目的字符串长度
wParam:从0开始计,指定要获取字符串长度的项目序号。
lParam:不需要
返回值:获取的字符长度(不包括字符串终止\0字符)
注:ANSI控件返回的是字节数,Unicode控件返回的是字符数。
8。CB_GETLBTEXT 获取指定项目的字符串
wParam:从0开始计,指定要获取字符串的项目序号。
lParam:接收字符串非缓冲区的指针
返回值:获取的字符长度
通知:
1。CBN_EDITCHANGE 编辑框内容改变
此通知通过WM_COMMAND发送到父窗口
wParam:低16位为组合框的ID,高16位为通知码 CBN_EDITCHANGE
lParam:组合框的句柄
2。CBN_SELCHANGE 用户通过单击或移动箭头键选中一项
此通知通过WM_COMMAND发送到父窗口
wParam:低16位为组合框的ID,高16位为通知码 CBN_EDITCHANGE
lParam:组合框的句柄
注:当使用 CB_SETCURSEL 消息设置当前选中项目时,不会发送 CBN_SELCHANGE 通知代码。
代码:
HWND combo1;
combo1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("COMBOBOX"), NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST , 350, 180, 100, 20, hwnd, (HMENU)9, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); SendMessage(combo1, WM_SETFONT, (WPARAM)GetStockObject(17), 0); SendMessage(combo1, CB_ADDSTRING, NULL, (LPARAM)TEXT("醉时空欢")); SendMessage(combo1, CB_ADDSTRING, NULL, (LPARAM)TEXT("I love Win32")); SendMessage(combo1, CB_ADDSTRING, NULL, (LPARAM)TEXT("MSDN")); SendMessage(combo1, CB_ADDSTRING, NULL, (LPARAM)TEXT("happy")); SendMessage(combo1, CB_SETCURSEL, 0, NULL);//自动选择第一项
case WM_COMMAND: int id; int ent; ent = HIWORD(wParam);//通知吗 id = LOWORD(wParam);//子窗口ID //判断菜单ID,注意不需要再判断HIWORD(wParam)了,因为菜单的通知码是一个定值(和控件不一样) switch (id) { case 3://这里使用在RC资源里面注册的菜单号 //。。。 } //判断按钮的单机事件 if (ent == BN_CLICKED){ switch (id) { case 4://按钮的子窗口ID //。。。。 case 7: //。。。。 case 8://Check Boxes被单机 //。。。。 } } if (ent == CBN_SELCHANGE){//选中一项时弹框这一项的内容 int now = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);//获取当前位置 int tchars = SendMessage((HWND)lParam, CB_GETLBTEXTLEN, now, 0);//获取这一项的字符数 TCHAR* t = new TCHAR[tchars+1];//申请内存,加1是留给\0使用的 t[tchars] = 0;//最后一位置0 SendMessage((HWND)lParam, CB_GETLBTEXT, now, (LPARAM)t);//将这一项的文字复制到刚申请的内存 MessageBox(hwnd, t, NULL, 0); delete [] t;//释放内存 } break;
效果图: