组合框有三种状态
风格 | 列表框何时可见 | 静态控件还是编辑控件 |
Simple | 总是可见 | 编辑控件 |
Drop-down | 当用户单击控件边上的下拉箭头时 | 编辑控件 |
Drop-downlist | 当用户单击控件边上的下拉箭头时 | 静态控件 |
组合框是有一个下拉列表和一个编辑框(或者说是静态文本框(主要是风格决定说法))
构造一个组合框分为两步,第一步就是构造CComboBox对象,然后调用该对象的Create函数来创建组合框,大小在RECT这个类型的参数设置,貌似组合框显示编辑框高度是一定的,能改变的只有宽度
增加字符串调用CComboBox::AddString函数
默认的组合框的编辑框不会显示任何内容,可以通过CComboBox::SetCurSel函数来设置当前显示的参数,传进一个基于0的索引,如果传进的是-1那么会清空当前编辑框中的显示内容
pCombox->Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,CRect(10,10,200,100),this,1010);
pCombox->AddString(_T("月薪2000"));
pCombox->AddString(_T("月薪5000"));
pCombox->AddString(_T("月薪10000"));
pCombox->AddString(_T("月薪20000"));
pCombox->AddString(_T("月薪30000"));
pCombox->AddString(_T("月薪50000"));
pCombox->SetCurSel(0);
//增加按钮
m_btnAdd.Create(_T("ADD"),WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,CRect(210,10,250,40),this,1011);
他可一响应的消息有
可能的消息映射入口如下:
· | ON_CBN_CLOSEUP | (Windows 3.1及更高版本)组合框的列表已被关闭。对于风格为CBS_SIMPLE的组合框来说,不会发送该通知消息。 |
· | ON_CBN_DBCLICK | 用户双击了列表框中的一个字符串。只对风格为CBS_SIMPLE的组合框发送。对于风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框来说,不会出现双击的消息,因为一次单击就会使下拉列表隐藏或显示了。 |
· | ON_CBN_DROPDOWN | 下拉出下拉列表(变为可见)。只对风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框起作用。 |
· | ON_CBN_EDITCHANGE | 用户发出了一个可能改变编辑控件中文本的动作。与消息CBN_EDITUPDATE不同,本消息是在Windows刷新屏幕之后发出的。风格为CBS_DROPDOWNLIST的组合框没有该通知。 |
· | ON_CBN_EDITUPDATE | 编辑控件部分将显示变化了的文本。本通知消息在控件已经格式化了文本但没有显示时发送。风格为CBS_DROPDOWNLIST的组合框没有该通知。 |
· | ON_CBN_ERRSPACE | 不能为组合框分配足够的内存进行响应某个请求。 |
· | ON_CBN_SELENDCANCEL | (Wndows 3.1及更高版本)表明用户的选择将被忽略。用户在单击了一个项之后,又单击了另外一个窗口或控件隐藏了组合框的下拉列表。此通知消息在CBN_CLOSEUP消息之前发送,以表明用户的选择将被忽略。即使没有发送CBN_CLOSEUP通知消息,也会发送CBN_SELENDCANCEL或CBN_SELENDOK消息(例如风格为CBS_SIMPLE的组合框)。 |
· | ON_CBN_SELENDOK | 用户在选择了一项以后,要么按了ENTER键,要么按了向下箭头键,从而隐藏了组合框的列表。此通知消息在CBN_CLOSEUP之前发送,表明用户的选择将不被认为是有效的。即使没有发送CBN_CLOSEUP通知消息,也会发送CBN_SELENDCANCEL或CBN_SEL-ENDOK消息(例如风格为CBS_SIMPLE的组合框)。 |
· | ON_CBN_KILLFOCUS | 组合框将失去输入焦点。 |
· | ON_CBN_SELCHANGE | 用户在列表中单击或者利用箭头键选择了另一个项,从而引起了选中项的改变。在处理此消息时,编辑控件中的文本只能通过GetLBText或者类似的某个函数存取。不能使用GetWindowText函数。 |
· | ON_CBN_SETFOCUS | 组合框获得输入焦点。 |
我自己实现了一个ON_CBN_SELCHANGE(1010,Choice)
获取列表框中的文本可以用GetLBText,如果要获取编辑框输入的本文可以是用GetDlgItemText函数来获取,那么在什么时候获取呢?可以在旁边创建一个按钮ADD
void C控件学习Dlg::Choice(void)
{
int sel=pCombox->GetCurSel();
CString str;
pCombox->GetLBText(sel,str);
MessageBox(str);
}
单击按钮的时候酒吧编辑框的内容添加进下拉列表
ON_BN_CLICKED(1011,AddString)
void C控件学习Dlg::AddString(void)
{
/*char str[15];
( GetDlgItem(1011))->GetWindowTextW(str,15);
CString str1(str);
pCombox->AddString(str1);*/
CString str;
GetDlgItemText(1010,str);
pCombox->AddString(str);
}
效果如图: