MFC--学生管理系统

 MFC--学生管理系统(更新)_m0_53252742的博客-CSDN博客

B站讲解:Bilibili 

更新版:

一.系统设计介绍:

MFC--学生管理系统_第1张图片

如图所示,实现了学生管理系统的增,删,改,查,排序

1.增:点击增加添加按钮之后会弹出另一个子类对话框

MFC--学生管理系统_第2张图片

         实现将编辑框中的内容添加到list control中,同时点击“录入”按钮之后,会提示录入成功

MFC--学生管理系统_第3张图片

如果没有将子类对话框的信息没有填完整,会提示添加失败,如图

MFC--学生管理系统_第4张图片2.删:点击删除按钮 之后会直接删除掉该条信息,但是没有提示

选中小王的那一条消息,点击删除删除后的列表框如图所示 

MFC--学生管理系统_第5张图片

3.改 :点击列表框中的某一条信息,会在右侧编辑框中实时显示出来,如果你想修改某条信息,直接在编辑框里修改,修改之后按下“修改”按钮 MFC--学生管理系统_第6张图片

会出现这个提示,如果点击“是 ”修改同步到列表框中,选择否则取消修改操作

4.查:有两种查找方式,一种是查找姓名,另一种是查找学号,无论是哪种方法,点击查找之后在列表框中表示高亮,但是编辑框没有变化。

MFC--学生管理系统_第7张图片

MFC--学生管理系统_第8张图片 5.查找:排列方式是用组合框。

根据日常习惯,数学,语文,外语,平均分这四项都是降序排列。

学号要升序排列。MFC--学生管理系统_第9张图片

6.文件的保存分为从所有文件里打开,另存为。和指定某个文件的打开和保存

 MFC--学生管理系统_第10张图片

 另存为和打开就是平常保存和打开文件的框框。

7.关闭应用:

如果没有保存就会提示出没有保存是否退出

MFC--学生管理系统_第11张图片

 二.主要代码展示

粘一下头文件的控件,函数

1.列表框的初始化

//初始化CListctrl控件。并插入一些标头,设置宽度和序列号。
	list1.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT);
	//拓展list control的格式
	//绘制网格线,表头可以拖拽,可以选择整行或者整列
	CString col[8] = { _T("姓名"),_T("学号"),_T("性别"),_T("语文"),_T("数学"),_T("英语"),_T("总分"),_T("平均分")};
	RECT r;	//rect对象用来存储一个矩形框的左上角坐标、宽度和高度。
	list1.GetClientRect(&r);	//显示矩形框调用函数要加取地址符号
	for (int i = 0; i < 8; i++)
	{
		list1.InsertColumn(i, col[i], LVCFMT_CENTER, r.right / 8);
	}
	list1.SetBkColor(RGB(100, 120, 200));	//设置列表框背景颜色
	list1.SetTextColor(RGB(200, 120, 300));	//字体颜色
	list1.SetTextBkColor(RGB(200, 200, 300));//文字背景色


	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

MFC--学生管理系统_第12张图片

 2.增

因为增是在子类对话框里添加到,所以和其他人画风不太一样


void Enroll::OnBnClickedButton1()//“录入”按钮代码。
{
	student stu(Dlg);
	Name.GetWindowTextW(stu.n[0]); //将控件上显示上的数据更新到关联变量
	Number.GetWindowTextW(stu.n[1]);
	YW.GetWindowTextW(stu.n[3]); 
	SX.GetWindowTextW(stu.n[4]);
	YY.GetWindowTextW(stu.n[5]);
	CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
	//写出单选框始末,最后一个是初始化时默认选择的单选框,选择一个单选框的同时删掉另一个单选框
	UINT nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2); 

	if (!nID)
	{
		MessageBox(L"请输入完整信息!", L"Error!"); Enroll::OnOK(); return;
	}
	GetDlgItemText(nID, stu.n[2]);
	for (int g = 0; g < 6; g++)
	{
		if (stu.n[g].IsEmpty())
		{
			MessageBox(L"请输入完整信息!", L"Error!");
			Enroll::OnOK();
			return;
		}
	}
	for (int i = 0; i < Dlg->list1.GetItemCount(); i++)
	{
		if (Dlg->list1.GetItemText(i, 1) == stu.n[1])
		{
			CString str("学号为");
			str += stu.n[1]; str += "的学生信息已录入!";
			MessageBox(str, L"Error!");
			Enroll::OnOK();
			return;
		}
	}
	Dlg->list1.InsertItem(Dlg->list1.GetItemCount(), L"");
	double x = _ttof(stu.n[3]) + _ttof(stu.n[4]) + _ttof(stu.n[5]);
	double y = x / 3;
	stu.n[6].Format(L"%f", x); stu.n[7].Format(L"%f", y);
	stu.set();
	MessageBox(L"录入成功", L"Finish!");
	Dlg->save = false;
	Enroll::OnOK();
}

//创建Enroll对话框类的OnInitDialog()初始化函数,换取父级对话框的指针。存进Enroll类的Dlg;
BOOL Enroll::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	CheckRadioButton(IDC_RADIO1, IDC_RADIO2,0);
	Dlg = (CMFCApplication6Dlg*)AfxGetMainWnd();
	return TRUE; 
}
BOOL Enroll::PreTranslateMessage(MSG* pMsg)

{
	// TODO: 在此添加专用代码和/或调用基类
	if (pMsg->message == WM_KEYDOWN)
	{
		switch (pMsg->wParam)
		{
		case VK_RETURN:     // 屏蔽回车
			OnBnClickedButton1();


			return TRUE;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

3.删 

void CMFCApplication6Dlg::OnBnClickedButton3()//“删除”按钮代码。
{
	//将已被选择的信息全部删除。if没有选择信息,弹出窗口显示错误信息。
	int count = list1.GetSelectedCount();
	POSITION pos = list1.GetFirstSelectedItemPosition();
	if (pos)
	{
		int p = 0;
		while (pos)
		{
			int k = list1.GetNextSelectedItem(pos);
			list1.DeleteItem(k-p); p++;
		}
		save = false;
	}
	else
		MessageBox(L"请选择需要删除的信息!", L"Error!");
}

 4.改

void CMFCApplication6Dlg::OnBnClickedButtonMainchange()
{
	// TODO: 在此添加控件通知处理程序代码

if (MessageBox(L"确定修改吗!", L"提示", MB_YESNO) == IDNO)	//消息弹出框,点击“否”则退出
		return;
else//如果点击"是"则进行程序
{
	UpdateData(TRUE);	//编辑框到变量
	int nIndex = list1.GetSelectionMark();//获取整行
	list1.SetItemText(nIndex, 0, Vmain_name);	//设置字符到编辑框
	list1.SetItemText(nIndex, 1, Vmain_number);
	list1.SetItemText(nIndex, 2, Vmain_sex);
	list1.SetItemText(nIndex, 3, Vmain_YW);
	list1.SetItemText(nIndex, 4, Vmain_SX);
	list1.SetItemText(nIndex, 5, Vmain_YY);
	float yw = _ttoi(Vmain_YW);			//cstring转float
	float sx = _ttoi(Vmain_SX);
	float yy = _ttoi(Vmain_YY);
	float sum = yw + sx + yy;			//用来计算
	Vmain_summ.Format(_T("%f"), sum);	//float转cstring
	list1.SetItemText(nIndex, 6, Vmain_summ);
	float aver = sum / 3.0;
	Vmain_average.Format(_T("%f"), aver);
	list1.SetItemText(nIndex, 7, Vmain_average);
}
}

5. 查

void CMFCApplication6Dlg::OnBnClickedButton2()//“查找”按钮代码。
{
	CString fname, fnumber;int index = list1.GetItemCount();
	int q = 0;
	for (int i = 0; i < index; i++)//初始化各行信息的选择状态,设置为未选择。
	{
		list1.SetItemState(i, 0, LVIS_SELECTED | LVIS_FOCUSED);
	}
	Fname.GetWindowTextW(fname); Fnumber.GetWindowTextW(fnumber);//获取需要搜索的姓名和学号,传入fname和fnumber。
	
	//判断fname和fnumber是否为空,并做出对应操作。用int q的值判断是否找到符合信息的学生。
	if (fname!=""&&fnumber!="")
	{
		for (int i = 0; i < index; i++)
		{
			if (list1.GetItemText(i, 0) == fname && list1.GetItemText(i, 1) == fnumber)
			{
				list1.SetFocus();
				list1.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
				list1.EnsureVisible(i, true); q = 1;
			}

		}
	}
	else if (fname!="" && fnumber=="")
	{
		for (int i = 0; i < index; i++)
		{
			if (list1.GetItemText(i, 0) == fname)
			{
				list1.SetFocus();//获得焦点
				list1.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
				//选中第一行,当鼠标点击列表光标悬浮在上面
				list1.EnsureVisible(i, true); q = 1;//确保可视化
			}
		}
	}
	else if (fname==""&&fnumber!="")
	{
		for (int i = 0; i < index; i++)
		{
			if (list1.GetItemText(i, 1) == fnumber)
			{
				list1.SetFocus();
				list1.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
				list1.EnsureVisible(i, true); q = 1;
			}
		}
	}
	else if (fname == "" && fnumber == "")
	{
		MessageBox(L"请输入查找信息!",L"Error!");
		return;
	}
	if (q == 0)
		MessageBox(L"没有找到该学生!",L"Error!");
}

写在最后:

这个东西也是我参照了好多大佬的资料添加的修改的。

后期也会再添加功能的,这次就先写这么多。

希望能够帮到大家吧。

你可能感兴趣的:(MFC,mfc,microsoft,c++)