[Win32SDK基本] Combo Box

本文由CSDN用户zuishikonghuan所作,转载请注明出处: http://blog.csdn.net/zuishikonghuan/article/details/46872885 

老规矩,先上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):

[Win32SDK基本] Combo Box_第1张图片

[Win32SDK基本] Combo Box_第2张图片

其他重要样式:

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;

效果图:

[Win32SDK基本] Combo Box_第3张图片

[Win32SDK基本] Combo Box_第4张图片





你可能感兴趣的:(Win32,windows,Desktop,sdk)