项目——基于MFC的成绩管理系统

article/2025/11/6 18:52:09

一、项目介绍

1、本项目结合了面向对象和window消息机制的知识,实现了一个简单的成绩管理系统。
2、项目包含两个类,学生类和管理类,一个用于成绩的存储,一个用于成绩的管理。
3、项目使用了MFC(微软基础类库)实现了友好的可视化界面。
4、项目实现了成绩的增加、修改、删除,存储还有排序功能。
5、项目源码链接https://github.com/Your-Julia/MFC-Mark-Management

二、创建项目

1、打开软件:VS2019

2、创建新项目 MFC应用(找不到的小伙伴百度去下载)

在这里插入图片描述

3、选择路径后创建 应用程序类型选择基于对话框

在这里插入图片描述

三、实体类底层逻辑

1、包含两个类,一个为Student,存储学生的个人信息;一个为Management,管理学生的个人信息。

2、Student类包含七个成员变量,分别为学号、姓名、性别、年龄、地址、数学成绩、C++成绩

	string id;string name;string sex;string age;string address;string math;string programing;

3、Student类成员函数包括对 七个属性的值的获取与设置

    void setName(string sname);void setId(string sid);void setAge(string sage);void setSex(string ssex);void setAddress(string saddress);void setMath(string smath);void setPrograming(string sprograming);string  getName();string  getSex();string  getAddress();string  getId();string  getAge();string  getMath();string  getPrograming();

4、Management类成员变量即Student类列表

	list<Student*>studentArray;

5、Management类有四个成员函数对Student类进行 增 删 改 清

    void Clear();//删除数据void Add(Student* pSt);//加入数据Student* Delete(string id);//删除指定数据void Modify(string sid, string sname, string ssex, string sage, string saddress, string smath, string sprograming);//修改指定数据

四、设置基础版UI

在这里插入图片描述

1、工具控件:列表,编辑框,静态文本,下拉框,按钮;
在这里插入图片描述
2、列表控件属性修改(右击拖拉出来的控件,选择属性)
在这里插入图片描述
3、下拉列表属性修改
在这里插入图片描述

五、为UI控件添加变量

1、单个控件添加变量的方法
在这里插入图片描述
2、添加变量注意修改的地方
在这里插入图片描述

3、界面全部控件添加变量的类型和名称 (选择对话框 右击选择类向导可查看全部控件变量)
在这里插入图片描述
可以看到5个按钮对应界面的增 删 改 确定 取消,7个编辑框对应界面相应的属性等

六、对话框初始化

1、查找对话框初始化代码位置 (选择DIg类 项目会创建AboutDIg App DIg三个类)
在这里插入图片描述
2、编写代码的位置
在这里插入图片描述
3、具体代码(主要是对列表控件的初始化 包括表头 还有风格)

	//1、为列表控件加入表头CString strHeader[] = { _T("学号"),_T("姓名"),_T("性别"),_T("年龄"),_T("地址"),_T("数学"),_T("C++") };int nWidth[] = { 80,80,60,60,80,80,80 };for (int i = 0; i < 7; i++)M_studentList.InsertColumn(i, strHeader[i], LVCFMT_LEFT, nWidth[i]);//2、设置列表空间显示风格 整行选中 显示网格M_studentList.SetExtendedStyle(M_studentList.GetExtendedStyle()| LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES);

4、运行结果
在这里插入图片描述

七、按钮事件编写

1、寻找单击事件代码位置
在这里插入图片描述

2、对应5个按钮的编写

  1. 增加按钮
//增加按钮
void Cmfc08Dlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码//0、将编辑框内容同步到变量UpdateData(TRUE);//1、往列表最后一行添加数据   count是用来记录学生个数的变量int newindex=M_studentList.InsertItem(M_studentList.GetItemCount(),M_id);M_studentList.SetItemText(newindex, 1, M_name);M_studentList.SetItemText(newindex, 2, M_sex);M_studentList.SetItemText(newindex, 3, M_age);M_studentList.SetItemText(newindex, 4, M_address);M_studentList.SetItemText(newindex, 5, M_math);M_studentList.SetItemText(newindex, 6, M_programing);//2、将编辑框的内容从CString转stringstring ID = CW2A(M_id.GetString());string NAME = CW2A(M_name.GetString());string SEX = CW2A(M_sex.GetString());string AGE = CW2A(M_age.GetString());string ADDRESS = CW2A(M_address.GetString());string MATH = CW2A(M_math.GetString());string PROGRAMING = CW2A(M_programing.GetString());//3、往类添加数据Student* pSt=new Student;pSt->setId(ID);pSt->setName(NAME);pSt->setSex(SEX);pSt->setAge(AGE);pSt->setAddress(ADDRESS);pSt->setMath(MATH);pSt->setPrograming(PROGRAMING);management.Add(pSt);//4、返回成功页面MessageBox(TEXT("添加成功!"));}
  1. 修改按钮
//修改按钮
void Cmfc08Dlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码//0、将编辑框内容同步到变量UpdateData(TRUE);//1、获取列表选定索引int nIndex = M_studentList.GetSelectionMark();//2、更改列表内容M_studentList.SetItemText(nIndex, 0, M_id);M_studentList.SetItemText(nIndex, 1, M_name);M_studentList.SetItemText(nIndex, 2, M_sex);M_studentList.SetItemText(nIndex, 3, M_age);M_studentList.SetItemText(nIndex, 4, M_address);M_studentList.SetItemText(nIndex, 5, M_math);M_studentList.SetItemText(nIndex, 6, M_programing);//3、更改类内容string ID = CW2A(M_id.GetString());string NAME = CW2A(M_name.GetString());string SEX = CW2A(M_sex.GetString());string AGE = CW2A(M_age.GetString());string ADDRESS = CW2A(M_address.GetString());string MATH = CW2A(M_math.GetString());string PROGRAMING = CW2A(M_programing.GetString());management.Modify(ID, NAME, SEX, AGE, ADDRESS, MATH, PROGRAMING);//4、返回成功页面MessageBox(TEXT("修改成功!"));}
  1. 删除按钮
//删除按钮
void Cmfc08Dlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码//1、获取列表选定索引int nIndex = M_studentList.GetSelectionMark();//2、从列表中删除M_studentList.DeleteItem(nIndex);//3、从类中删除string ID = CW2A(M_id.GetString());management.Delete(ID);//4、返回成功页面MessageBox(TEXT("删除成功!"));}
  1. 确定按钮
//确定按钮
void Cmfc08Dlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知处理程序代码CDialog::OnOK();
}
  1. 取消按钮
//取消按钮
void Cmfc08Dlg::OnBnClickedButton5()
{// TODO: 在此添加控件通知处理程序代码CDialog::OnCancel();
}

3、查找列表选中触发事件 (属性 -> 事件 -> NM_CLICK -> ADD)
在这里插入图片描述
4、编写代码——选中后编辑框填满相应信息

//单击列表内容
void Cmfc08Dlg::OnNMClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;//1、获取列表选定索引int nIndex = M_studentList.GetSelectionMark();//2、获取索引指定内容CString ID = M_studentList.GetItemText(nIndex, 0);CString NAME = M_studentList.GetItemText(nIndex, 1);CString SEX = M_studentList.GetItemText(nIndex, 2);CString AGE = M_studentList.GetItemText(nIndex, 3);CString ADDRESS = M_studentList.GetItemText(nIndex, 4);CString MATH = M_studentList.GetItemText(nIndex, 5);CString PROGRAMING = M_studentList.GetItemText(nIndex, 6);//3、将内容赋值给变量M_id = ID;M_name = NAME;M_sex = SEX;M_age = AGE;M_address = ADDRESS;M_math = MATH;M_programing = PROGRAMING;//4、将变量内容显示到编辑框UpdateData(FALSE);
}

5、运行结果
在这里插入图片描述

八、数据的存储

1、数据的保存——Management类的成员函数

bool  Management::Save(const char* fileName){//创建文件写入流ofstream file(fileName, ios::out);//创建文件失败返回if (!file) return false;//写入学生个数file << studentArray.size() << '\n';//写入学生信息 转行隔开for (auto iter = studentArray.begin(); iter != studentArray.end(); ++iter)file << (**iter) << '\n';//文件关闭file.close();//返回创建成功return true;
}

2、数据的重新加载——Management类的成员函数

bool  Management::Open(const char* fileName){//原列表内容清空Clear();//创建文件读入流ifstream file(fileName, ios::in);//读入失败返回if (!file) return false;//接收文件学生人数int n = 0;file >> n;//为每个学生创建存储空间  并更新原有列表内容for (int k = 0; k < n; ++k){Student* pSt = new Student();file >> *pSt;studentArray.push_back(pSt);}//文件关闭file.close();//返回读入成功return true;
}

3、打开原有文件按钮

//打开原有文件按钮
void Cmfc08Dlg::OnBnClickedButton6()
{// TODO: 在此添加控件通知处理程序代码//1、打开文件  对学生列表进行更新management.Open("studentmark.txt");//2、将原来的列表内容进行清空M_studentList.DeleteAllItems();//3、获取类中的学生信息list<Student*> arr = *(management.GetStudent());//4、将学生列表内容展现在列表上int count = 0;CString student[7];for (auto iter = arr.begin(); iter != arr.end(); iter++) {//string->CStringstudent[0] = (*iter)->getId().c_str();student[1] = (*iter)->getName().c_str();student[2] = (*iter)->getSex().c_str();student[3] = (*iter)->getAge().c_str();student[4] = (*iter)->getAddress().c_str();student[5] = (*iter)->getMath().c_str();student[6] = (*iter)->getPrograming().c_str();for(int i=0;i<7;i++)if(i==0)M_studentList.InsertItem(count,student[0]);elseM_studentList.SetItemText(count, i, student[i]);count++;}//5、返回成功页面MessageBox(TEXT("加载成功!"));
}

4、保存按钮——在确定按钮上作修改

//确定按钮  也称保存按钮
void Cmfc08Dlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知处理程序代码//1、保存信息management.Save("studentmark.txt");//2、返回成功页面MessageBox(TEXT("保存成功!"));//3、关闭窗口CDialog::OnOK();
}

5、运行结果

  1. 项目下有被创建的txt文件
    在这里插入图片描述

  2. 打开原有文件,保存的学生信息会被加载
    在这里插入图片描述

九、成绩的排序

1、类的成员函数(以数学为例)

//Student类
bool LessMath(const Student* st1, const Student* st2){return st1->math > st2->math;
}
//Management类
void Management::SortByMath(){studentArray.sort(LessMath);
}

2、界面的触发事件及代码
在这里插入图片描述

void Cmfc08Dlg::OnLvnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;//1、获取点击列int column = pNMLV->iSubItem;if (column == 5|| column == 6) {//2、数学排序if(column==5)management.SortByMath();//3、C++排序elsemanagement.SortByOop();//3、获取类中的学生信息list<Student*> arr = *(management.GetStudent());//4、列表内容清空M_studentList.DeleteAllItems();//5、将排序好的学生列表内容展现在列表上int count = 0;CString student[7];for (auto iter = arr.begin(); iter != arr.end(); iter++) {//string->CStringstudent[0] = (*iter)->getId().c_str();student[1] = (*iter)->getName().c_str();student[2] = (*iter)->getSex().c_str();student[3] = (*iter)->getAge().c_str();student[4] = (*iter)->getAddress().c_str();student[5] = (*iter)->getMath().c_str();student[6] = (*iter)->getPrograming().c_str();for (int i = 0; i < 7; i++)if (i == 0)M_studentList.InsertItem(count, student[0]);elseM_studentList.SetItemText(count, i, student[i]);count++;}}
}

3、运行结果

在这里插入图片描述

在这里插入图片描述

十、项目总结

1、实体类底层知识

  1. Management依赖STL中的列表容器
#include <list>list<student*> studentList;
//增加
studentList.push_back(student*);
//指定删除
for(auto iter=studentList.begin();iter!=studentList.end();++iter)if(*iter->id)delete *iter;
//全部删除
for(auto iter=studentList.begin();iter!=studentList.end();++iter)delete *iter;
//修改
auto stu;
for(auto iter=studentList.begin();iter!=studentList.end();++iter)if(*iter->id)stu=iter;
stu->setId();stu->setName();stu->setSex();...
  1. Management的数据存储功能
#include <fstream>
//打开文件
ofstream file(filename, ios::out)
//出错判断
if(!file) return false;
//写入学生人数n
file<<studentList<<'\n';
//写入学生信息
for (auto iter = studentArray.begin(); iter != studentArray.end(); ++iter)file << (**iter) << '\n';
//关闭文件
file.close();
//返回成功
return true
  1. Management的数据加载功能
#include <fstream>
//打开已有文件
ifstream file(fileName, ios::in);
//出错判断
if (!file) return false;
//接收学生人数
int n = 0;file >> n;
//接收学生信息
for (int k = 0; k < n; ++k){Student* pSt = new Student();file >> *pSt;studentArray.push_back(pSt);
}
//关闭文件
file.close();
//返回成功
return true;

2、MFC控件使用的API——看注释就行

  1. 列表控件
//1、列表表头设置  InsertColumn()
CString strHeader[] = { _T("学号"),_T("姓名"),_T("性别"),_T("年龄"),_T("地址"),_T("数学"),_T("C++") };
int nWidth[] = { 80,80,60,60,80,80,80 };
for (int i = 0; i < 7; i++)M_studentList.InsertColumn(i, strHeader[i], LVCFMT_LEFT, nWidth[i]);//2、列表风格设置  SetExtendedStyle()
M_studentList.SetExtendedStyle(M_studentList.GetExtendedStyle()| LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES);//3、列表插入数据 GetItemCount()  InsertItem()  SetItemText()
int newindex=M_studentList.InsertItem(M_studentList.GetItemCount(),M_id);
M_studentList.SetItemText(newindex, 1, M_name);
M_studentList.SetItemText(newindex, 2, M_sex);
M_studentList.SetItemText(newindex, 3, M_age);
M_studentList.SetItemText(newindex, 4, M_address);
M_studentList.SetItemText(newindex, 5, M_math);
M_studentList.SetItemText(newindex, 6, M_programing);//4、列表修改数据 GetSelectionMark()  SetItemText()
int nIndex = M_studentList.GetSelectionMark();
M_studentList.SetItemText(nIndex, 0, M_id);
M_studentList.SetItemText(nIndex, 1, M_name);
M_studentList.SetItemText(nIndex, 2, M_sex);
M_studentList.SetItemText(nIndex, 3, M_age);
M_studentList.SetItemText(nIndex, 4, M_address);
M_studentList.SetItemText(nIndex, 5, M_math);
M_studentList.SetItemText(nIndex, 6, M_programing);//5、列表删除指定数据 GetSelectionMark()  DeleteItem()
int nIndex = M_studentList.GetSelectionMark();
M_studentList.DeleteItem(nIndex);//6、列表删除全部数据  DeleteAllItems()
M_studentList.DeleteAllItems();
  1. 下拉列表和编辑框
将其变量设置为CString,便可直接对其值进行使用
变量->控件:UpdateData(FALSE);
控件->变量:UpdateData(TRUE);

3、MFC控件常用触发事件

  1. 列表
列表选中某一行触发事件名称:NM_CLICK
列表选中某一列触发事件名称:LVN_COLUMNCLICK
  1. 按钮
按钮单击触发事件名称:BN_CLICKED

4、类型转换

  1. string->CString
string id="101";
CString id(id.c_str());
  1. CString->string
CString id;
string id=CW2A(id.GetString());

http://chatgpt.dhexx.cn/article/tXTiEw0L.shtml

相关文章

Python作用域总结

Python特有的语法规则和诸如Java等其他静态类型语言有很大不同&#xff0c;而作用域规则则是其一&#xff0c;初识Python会遇到一些问题&#xff0c;现在对Python作用域相关的知识做个总结。 Python作用域规则一句话概括就是 LEGB 规则; L 代表 Local、E 代表 enclosing、G 代表…

python作用域问题

python作用域问题 有一句话很重要&#xff0c;要说在前面&#xff1b;类型是属于对象的&#xff0c;并不是属于变量&#xff1b; 而在python这门语言中&#xff0c;有一种说法叫做“鸭子类型”&#xff1a;“当看到一直鸟走起来像鸭子,游泳起来像鸭子 &#xff0c;叫起来也像…

python的作用域问题

命名空间 python中的namespace &#xff08;命名空间&#xff09;是映射到对象的名称。 命名空间的几个常见示例&#xff1a; abs() 函数、内置异常等的内置函数集合&#xff1b;模块中的全局名称&#xff1b;函数调用中的局部名称。对象的属性集合也算是一种命名空间。关于命…

实用解决Python作用域问题

前言&#xff1a;一直以来对Python的作用域问题有很多的疑惑&#xff0c;看了很多大牛的讲解之后有所收获&#xff0c;所以就记录下来 1、块级作用域 想想此时运行下面的程序会有输出吗&#xff1f;执行会成功吗&#xff1f; 1 2 3 4 5 6 7 8 9 10 11 12 #块级作用域 if 1…

python变量的作用域

作用域又可以被称为命名空间&#xff0c;指变量起作用的范围。Python变量作用域可以分为四种&#xff0c;分别为局部作用域、嵌套作用域、全局作用域、内置作用域。 作用域英文简写局部作用域LocalL嵌套作用域EnclosedE全局作用域GlobalG内置作用域Built-inB 四种作用域中变量…

linux-虚拟化管理工具

一、虚拟化管理工具 1.虚拟机的安装 用图形方式进行虚拟机的安装 安装镜像 设置虚拟机名字和占用内存大小 2.虚拟机的脚本安装 vim /bin/vm_create.sh 建立在/sbin目录底下&#xff0c;方便以后使用 #!/bin/bash ##幻数&#xff0c;脚本中命令…

常用虚拟机软件推荐

很多时候&#xff0c;由于工作的需要&#xff0c;都需要在不同的系统环境中进行调试开发&#xff0c;要么自己有多台电脑&#xff0c;安装不同的系统&#xff0c;要么给电脑装多系统。但这些都不是很现实&#xff0c;前者要资金&#xff0c;后者想进行系统切换也够费劲的了&…

理解全虚拟、半虚拟以及硬件辅助的虚拟化

接触过的一些搞了几年云计算的童鞋&#xff0c;也没明白常见的几种虚拟机技术方案的异同&#xff0c;比如只是记住了半虚拟要在虚拟机装驱动而全虚拟不需要&#xff0c;也不知道有时候为什么需要打开BIOS里的VT项。本人呢&#xff0c;在看了各种讲解虚拟化的书籍之后&#xff0…

虚拟化(二):虚拟化及vmware workstation产品使用

虚拟化&#xff08;一&#xff09;&#xff1a;虚拟化及vmware产品介绍 vmware workstation的最新版本是10.0.2。相信大家也都使用过&#xff0c;其中的简单的虚拟机的创建&#xff0c;删除等&#xff0c;都很简单&#xff0c;这里就不再详细说明了&#xff0c;下面我将简单介绍…

什么是虚拟化?

什么是虚拟化&#xff1f; “虚拟化“这个词只要是接触过计算机和网络的&#xff0c;或多或少都有听过。什么虚拟机、存储虚拟化、网络虚拟化、网络功能虚拟化&#xff08;NFV&#xff09;、虚拟资源池……今天从什么是虚拟化讲起。 什么是虚拟化 由于虚拟化在各种企业的技术…

虚拟化管理工具的安装与使用

虚拟化管理工具的安装与使用 Libvirt是一个软件的集合&#xff0c;包括API库&#xff0c;后台运行程序(Libvirtd)和命令行工具(virsh)。 Libvirt主要有下面3个功能&#xff1a; 1 虚拟机管理&#xff1a;以虚拟机为对象&#xff0c;Libvirt提供了定义&#xff0c;删除&#x…

开源虚拟化工具VirtualBox安装部署

什么是Virtualbox VirtualBox是一款由Oracle开发和维护的免费开源虚拟化软件&#xff0c;用于在一台计算机上创建和管理多个虚拟机。它允许用户在单个物理计算机上运行多个操作系统&#xff0c;例如Windows、Linux、macOS等。VirtualBox提供了一个虚拟化环境&#xff0c;使用户…

虚拟机的虚拟化如何开启?

大家可以在任务管理器-性能中&#xff0c;查看“虚拟化”是【已启用】还是【已禁用】。如果是禁用了&#xff0c;可以接着往下看我们如何开启虚拟化。 1、关闭电脑的快速启动 控制面板-电源选项-选择电源按钮的功能-更改当前不可用的设置&#xff1b;把关机设置中的【所有都取…

kvm虚拟化管理工具

kvm虚拟化管理工具 一、什么是云计算&#xff1f;二、云计算的基础KVM虚拟化三、安装kvm虚拟化管理工具四、virsh虚拟机的日常操作(开关&#xff0c;挂起虚拟机&#xff0c;导配置文件&#xff0c;磁盘增容&#xff0c;转化磁盘格式等&#xff09;五、快照管理六、KVM虚拟机的克…

有哪些虚拟化和容器化工具推荐? - 易智编译EaseEditing

以下是几个常用的虚拟化和容器化工具推荐&#xff1a; VMware vSphere&#xff1a; VMware vSphere 是一套完整的虚拟化平台&#xff0c;包括虚拟化服务器、虚拟化存储和虚拟化网络。 它提供了高性能的虚拟机管理和资源调度功能&#xff0c;适用于企业级的虚拟化部署。 Docke…

KVM虚拟化工具简介及安装

文章目录 1. KVM简介2. 安装前提3. KVM安装4. KVM启用5. 虚拟机安装和设置 1. KVM简介 Kernel-based Virtual Machine的简称&#xff0c;是一个开源的系统虚拟化模块&#xff0c;自Linux2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理&#xff…

虚拟化工具介绍 (资源)

2019独角兽企业重金招聘Python工程师标准>>> 常见的虚拟化产品:docker、Hyper-V、VMware、VirtualBox、XenServer、Kvm、Qemu、OpenVZ、Xen、CloudStack、Openstack、云计算、云其他。 常见的虚拟化 技术 :ESXI、XEN、KVM、HP-V、Docker、Virtual-BOX, 使用最广泛…

AppScan 10中文版

教程&#xff1a; 1、下载解压缩&#xff0c;得到获得AppScan10中文版原程序&#xff1b; 2、首先双击“AppScan_Setup_10.0.0.exe”开始安装&#xff0c;选择简体中文&#xff1b; 3、勾选“我接受许可协议中的全部条款”&#xff0c;然后继续安装&#xff1b; 4、选择软件安…

安全测试工具APPScan下载安装及简单使用

一、安装 百度随便找了个网址下的&#xff0c;解压后如图&#xff1a;AppScan_Std_9.0.3.7_Eval_Win.exe是安装程序&#xff0c;LicenseProvider.dll是替换文件。安装包600多MB建议硬盘留存避免重复下载。 安装简单&#xff0c;注意修改下安装路径&#xff0c;另外会弹出提示是…

AppScan

AppScan是用于web项目的安全测试工具&#xff0c;扫描网站所有url&#xff08;自动手动&#xff09;&#xff0c;自动测试是否存在各种类型的漏洞。 使用步骤 选择记录 就会弹出appscan自带的浏览器&#xff0c;在其中输入账号密码&#xff0c;appscan就会自动记录 点击下一步…