欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 实例步骤:

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

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

2.3.4 源程序解读:

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