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

一、项目介绍

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转string
	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());

	//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->CString
		student[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]);
			else
				M_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++排序
		else
			management.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->CString
			student[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]);
				else
					M_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());
  • 36
    点赞
  • 283
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
学生成绩管理系统是一个非常常见的应用程序,通过MFC框架开发,可以实现对学生信息、课程信息和成绩信息的管理和查询,同时也可以进行数据的统计和分析。以下是一个简单的学生成绩管理系统的开发流程: 1. 界面设计:使用MFC框架提供的控件和对话框,设计学生信息、课程信息和成绩信息的录入和查询界面。 2. 数据库设计:使用MFC框架提供的数据库类,设计学生信息、课程信息和成绩信息的数据表结构,包括学生ID、姓名、性别、年龄、课程名称、成绩等字段。 3. 数据库连接:使用MFC框架提供的ODBC数据库连接技术,连接数据库并读写数据。 4. 数据录入:在录入界面中,将学生信息、课程信息和成绩信息通过文本框或下拉框等控件输入到数据库中。 5. 数据查询:在查询界面中,通过输入学生ID或课程名称等关键词,查询数据库中对应的学生信息、课程信息和成绩信息,并在列表框或表格控件中显示出来。 6. 数据统计:使用MFC框架提供的图表控件或自定义绘图技术,实现成绩数据的统计和分析,例如平均分、最高分、最低分等指标。 7. 数据导出:使用MFC框架提供的文件操作类,将查询结果导出为Excel或文本文件,以便进行进一步处理和分析。 以上就是一个基于MFC框架开发的学生成绩管理系统的基本开发流程。当然,具体的实现过程还需要根据具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值