2.3 组合框(Combo Box)和列表框(List Box)使用实例

组合框和列表框都可以在界面上同时显示多项内容,并且允许用户选中其中的某项内容,列表框还允许同时选择多项。这两种控件的使用,有很多相似之处;

2.3.1 技术要点:

  • Windows 中预先定义了一系列“CB_ ”开头的消息,用于向组合框发送命令。例如向控件发送“CB_ ADDSTRING”,就可以在控件的下拉列表中添加新项;
  • 当组合框控件中有通知事件发生时,控件会向父窗口发出以“CBN_ ”开头的通知消息。例如“CBN_ SELCHANGE”消息代表控件的当前选中项发生了改变;
  • Windows 中预先定义了一系列“LB_ ”开头的消息,用于向列表框发送命令,比如“LB_ ADDSTRING”消息可以向控件中添加新项;
  • 当列表框中发生事件时,控件会向父窗口发送以“LBN_ ”开头的通知消息,比如“LBN_ DBLCLK”代表用户在控件中双击了鼠标;
  • 在 MFC 中,组合框的封装类是 CComboBox,列表框的封装类是 CListBox 。通过调用这些封装类的方法,即可实现对控件的操作。但在控件内部,还是通过发送消息的方法实现对控件操作;

2.3.2 实例步骤:

在本节的实例中,通过一个应用程序演示组合框和列表框的使用,实例步骤如下所示:

  1. 新建一个基于对话框的 MFC 应用程序,命名为“ComboBoxDemo”;2.3 组合框(Combo Box)和列表框(List Box)使用实例_第1张图片
  2. 在主对话框上添加一个组合框控件,将其ID修改为“IDC_CMB_DEMO”去掉其“Sort”风格,并通过类向导为控件添加一个控件型变量,变量名称为“m_cmb_demo”;2.3 组合框(Combo Box)和列表框(List Box)使用实例_第2张图片2.3 组合框(Combo Box)和列表框(List Box)使用实例_第3张图片
  3. 在主对话框上添加一个列表框控件,将其ID修改为“IDC_LST_DEMO”,去掉其“Sort”风格,将其“Selection”属性改为“Single”,并通过类向导为控件添加一个名称为“m_lst_demo”的控件型变量;2.3 组合框(Combo Box)和列表框(List Box)使用实例_第4张图片2.3 组合框(Combo Box)和列表框(List Box)使用实例_第5张图片
  4. 在主对话框中添加一个ID为“IDC_EDT_TEXT”的文本框,用于输入新项内容;2.3 组合框(Combo Box)和列表框(List Box)使用实例_第6张图片
  5. 在主对话框上添加两个按钮控件,控件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 组合框(Combo Box)和列表框(List Box)使用实例_第7张图片

2.3.4 源程序解读:

  • 在本例中,界面上的组合框和列表框都没有选取“Sort”风格。当控件具有该风格时,每次向控件中添加新项,都会导致控件中的项目进行排序,如果项目比较多,会影响程序运行效率。所以在不需要自动排序的场合,应去掉该风格;
  • 组合框有3种外观形式,分别是“Simple”、“Dropdown”和“Drop List”,本例中使用的是默认的“Dropdown”。当控件类型为“Simple”时,控件的下拉列表框将一直显示;当控件类型为“Drop List”时,控件中的文本框为只读模式;
  • 本例中的列表框为单选模式,如果控件处于多选模式,则允许用户同时选择多个列表项。当单击一个列表项时,如果该项处于选中状态,则取消其选中状态,如果处于非选中状态,则变成选中状态;

你可能感兴趣的:(认识VC++6-0)