MFC编程(四)

列表框/组合框的使用

列表框

页面布局如下
MFC编程(四)

  • 使用类:
    • CWnd:组建基类
    • CListBox:列表框
  • 使用函数:
    • CWnd::UpdateData(bool):
      • 参数为true:获取控件中的数据
      • 参数为false:更新控件的数据显示
    • CListBox::AddString():<int>:向列表中添加数据并返回该数据的索引值
    • CListBox::DeleteString(int):从列表中删除指定索引值的项
    • CListBox::SetItemDataPtr(int, *xxx):设置指定索引值的关联项指针
    • CListBox::GetItemDataPtr(int):<*xxx>:获取指定索引值的关联项指针
    • CListBox::GetCurSel():<int>:获取当前选择项的索引值
    • CListBox::FindStringExact(int, string):[LB_ERR]:从指定位置搜索列表中是否含有某项值

在DemoDlg中定义保存数据的结构体

class CDemoDlg : public CDialog
{
...
private:
    struct student {
        CString name;
        long no;
        CString sex;
        int age;
        CString clazz;
    };
};

编写添加事件

void CDemoDlg::OnInsert() 
{
    // 处理姓名
    this->UpdateData();
    if (this->m_name.IsEmpty()) {
        MessageBox("学生姓名不能为空!");
        return;
    }
    m_name.TrimLeft();
    m_name.TrimRight();
    // 搜索是否已经录入
    if ((m_list.FindStringExact(-1, m_name))!=LB_ERR) {
        MessageBox("该学生已被录入,不可重复添加!");
        return;
    }
    // 处理其他属性
    m_class.TrimLeft();
    m_class.TrimRight();
    m_sex.TrimLeft();
    m_sex.TrimRight();
    //添加到列表
    int index = m_list.AddString(m_name);
    student std;
    std.name = m_name;
    std.sex = m_sex;
    std.age = m_age;
    std.clazz = m_class;
    std.no = m_no;
    m_list.SetItemDataPtr(index, new student(std));
}

编写删除事件

void CDemoDlg::OnDelete() 
{
    // 获取当前选择项的索引
    int index = m_list.GetCurSel();
    if (index != LB_ERR) {
        delete (student *)m_list.GetItemDataPtr(index);
        m_list.DeleteString(index);
        // 清空显示数据
        m_name = m_class = m_sex = "";
        m_no = m_age = 0;
        // 更新数据显示
        UpdateData();
    } else
        MessageBox("没有选择列表项!");
}

编写列表框选择事件

void CDemoDlg::OnSelchangeStudentList() 
{
    int index = m_list.GetCurSel();
    if (index != LB_ERR) {
        // 获得当前选择的列表项的关联结构体
        student *pst = (student *)m_list.GetItemDataPtr(index);
        m_name = pst->name;
        m_age = pst->age;
        m_class = pst->clazz;
        m_no = pst->no;
        m_sex = pst->sex;
        // 更新窗口数据显示
        UpdateData();
    }
}

编写退出事件

void CDemoDlg::OnCancel() 
{
    // 清除内存中的所有垃圾数据
    for (int index = m_list.GetCount() - 1; index >= 0; index--) {
        delete (student *)m_list.GetItemDataPtr(index);
    }
    CDialog::OnCancel();
}

运行结果
MFC编程(四)

组合框

MFC编程(四)

  • 使用类:
    • CWnd:组建基类
    • CComboBox:列表框
  • 使用函数:
    • CWnd::UpdateData(bool):
      • 参数为true:获取控件中的数据
      • 参数为false:更新控件的数据显示
    • CComboBox::AddString():<int>:向列表中添加数据并返回该数据的索引值
    • CComboBox::DeleteString(int):从列表中删除指定索引值的项
    • CComboBox::SetItemDataPtr(int, *xxx):设置指定索引值的关联项指针
    • CComboBox::GetItemDataPtr(int):<*xxx>:获取指定索引值的关联项指针
    • CComboBox::GetCurSel():<int>:获取当前选择项的索引值
    • CComboBox::FindStringExact(int, string):[LB_ERR]:从指定位置搜索列表中是否含有某项值

在DemoDlg中定义保存数据的结构体

class CDemoDlg : public CDialog
{
...
private:
    struct student {
        CString name;
        long no;
        CString sex;
        int age;
        CString clazz;
    };
};

编写添加事件

void CDemoDlg::OnInsert() 
{
    // 处理姓名
    this->UpdateData();
    if (this->m_name.IsEmpty()) {
        MessageBox("学生姓名不能为空!");
        return;
    }
    m_name.TrimLeft();
    m_name.TrimRight();
    // 搜索是否已经录入
    if ((m_combo.FindStringExact(-1, m_name))!=LB_ERR) {
        MessageBox("该学生已被录入,不可重复添加!");
        return;
    }
    // 处理其他属性
    m_class.TrimLeft();
    m_class.TrimRight();
    m_sex.TrimLeft();
    m_sex.TrimRight();
    //添加到列表
    int index = m_combo.AddString(m_name);
    student std;
    std.name = m_name;
    std.sex = m_sex;
    std.age = m_age;
    std.clazz = m_class;
    std.no = m_no;
    m_combo.SetItemDataPtr(index, new student(std));
}

编写删除事件

void CDemoDlg::OnDelete() 
{
    // 获取当前选择项的索引
    int index = m_combo.GetCurSel();
    if (index != LB_ERR) {
        delete (student *)m_combo.GetItemDataPtr(index);
        m_combo.DeleteString(index);
        // 清空显示数据
        m_name = m_class = m_sex = "";
        m_no = m_age = 0;
        // 更新数据显示
        UpdateData();
    } else
        MessageBox("没有选择列表项!");
}

编写列表框选择事件

void CDemoDlg::OnSelchangeStudentList() 
{
    int index = m_combo.GetCurSel();
    if (index != LB_ERR) {
        // 获得当前选择的列表项的关联结构体
        student *pst = (student *)m_combo.GetItemDataPtr(index);
        m_name = pst->name;
        m_age = pst->age;
        m_class = pst->clazz;
        m_no = pst->no;
        m_sex = pst->sex;
        // 更新窗口数据显示
        UpdateData();
    }
}

编写退出事件

void CDemoDlg::OnCancel() 
{
    // 清除内存中的所有垃圾数据
    for (int index = m_combo.GetCount() - 1; index >= 0; index--) {
        delete (student *)m_combo.GetItemDataPtr(index);
    }
    CDialog::OnCancel();
}

运行结果
MFC编程(四)

MFC
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1
Dennis_Ritchie

mfc有点老了

3年前 评论
calong (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!