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(); }
运行结果
组合框
- 使用类:
- 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]:从指定位置搜索列表中是否含有某项值
- CWnd::UpdateData(bool):
在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(); }
运行结果
本作品采用《CC 协议》,转载必须注明作者和本文链接
mfc有点老了