2.3 组合框(Combo Box)和列表框(List Box)使用实例
程序员文章站
2022-05-31 13:29:02
...
组合框和列表框都可以在界面上同时显示多项内容,并且允许用户选中其中的某项内容,列表框还允许同时选择多项。这两种控件的使用,有很多相似之处;
2.3.1 技术要点:
- Windows 中预先定义了一系列“CB_ ”开头的消息,用于向组合框发送命令。例如向控件发送“CB_ ADDSTRING”,就可以在控件的下拉列表中添加新项;
- 当组合框控件中有通知事件发生时,控件会向父窗口发出以“CBN_ ”开头的通知消息。例如“CBN_ SELCHANGE”消息代表控件的当前选中项发生了改变;
- Windows 中预先定义了一系列“LB_ ”开头的消息,用于向列表框发送命令,比如“LB_ ADDSTRING”消息可以向控件中添加新项;
- 当列表框中发生事件时,控件会向父窗口发送以“LBN_ ”开头的通知消息,比如“LBN_ DBLCLK”代表用户在控件中双击了鼠标;
- 在 MFC 中,组合框的封装类是 CComboBox,列表框的封装类是 CListBox 。通过调用这些封装类的方法,即可实现对控件的操作。但在控件内部,还是通过发送消息的方法实现对控件操作;
…
2.3.2 实例步骤:
在本节的实例中,通过一个应用程序演示组合框和列表框的使用,实例步骤如下所示:
- 新建一个基于对话框的 MFC 应用程序,命名为“ComboBoxDemo”;
- 在主对话框上添加一个组合框控件,将其ID修改为“IDC_CMB_DEMO”去掉其“Sort”风格,并通过类向导为控件添加一个控件型变量,变量名称为“m_cmb_demo”;
- 在主对话框上添加一个列表框控件,将其ID修改为“IDC_LST_DEMO”,去掉其“Sort”风格,将其“Selection”属性改为“Single”,并通过类向导为控件添加一个名称为“m_lst_demo”的控件型变量;
- 在主对话框中添加一个ID为“IDC_EDT_TEXT”的文本框,用于输入新项内容;
- 在主对话框上添加两个按钮控件,控件ID分别为“IDC_BTN_ADD”和“IDC_BTN_DELETE”,控件文本分别为“添加”和“删除所选”。并通过类向导为按钮添加单击事件响应函数,函数代码如下所示;
//“添加”按钮的响应函数
void CComboBoxDemoDlg::OnBtnAdd()
{
CString strText;
//取得用户输入
GetDlgItemText(IDC_EDT_TEXT, strText);
if(strText.GetLength() > 0)
{
//向组合框添加字符串
m_cmb_demo.AddString(strText);
//选中刚刚添加的项
m_cmb_demo.SetCurSel(m_cmb_demo.GetCount() - 1);
//向列表框添加字符串
m_lst_demo.AddString(strText);
//选中刚刚添加的项
m_lst_demo.SetCurSel(m_lst_demo.GetCount() - 1);
}
}
//“删除”按钮的响应函数
void CComboBoxDemoDlg::OnBtnDelete()
{
int nIndex;
//取得组合框的当前所选,如果nIndex等于-1,代表没有选中项
nIndex = m_cmb_demo.GetCurSel();
if(nIndex > -1)
{
//如果有选中项,删除该项
m_cmb_demo.DeleteString(nIndex);
//让控件选中下一项
if(nIndex < m_cmb_demo.GetCount())
m_cmb_demo.SetCurSel(nIndex);
else
m_cmb_demo.SetCurSel(0);
}
//取得列表框的当前所选
nIndex = m_lst_demo.GetCurSel();
if(nIndex > -1)
{
//如果有选中项,删除该项
m_lst_demo.DeleteString(nIndex);
//让控件选中下一项
if(nIndex < m_lst_demo.GetCount())
m_lst_demo.SetCurSel(nIndex);
else
m_lst_demo.SetCurSel(0);
}
}
2.3.3 程序运行:
按F5键运行程序,在文本框中输入一些字符,单击“添加”按钮,就会将输入的字符串作为新项添加到组合框的列表框中。选中组合框和列表框中的某项,单击“删除所选”按钮,控件中当前选中的项目就会被删除;
2.3.4 源程序解读:
- 在本例中,界面上的组合框和列表框都没有选取“Sort”风格。当控件具有该风格时,每次向控件中添加新项,都会导致控件中的项目进行排序,如果项目比较多,会影响程序运行效率。所以在不需要自动排序的场合,应去掉该风格;
- 组合框有3种外观形式,分别是“Simple”、“Dropdown”和“Drop List”,本例中使用的是默认的“Dropdown”。当控件类型为“Simple”时,控件的下拉列表框将一直显示;当控件类型为“Drop List”时,控件中的文本框为只读模式;
- 本例中的列表框为单选模式,如果控件处于多选模式,则允许用户同时选择多个列表项。当单击一个列表项时,如果该项处于选中状态,则取消其选中状态,如果处于非选中状态,则变成选中状态;