MFC--学生管理系统(更新)_m0_53252742的博客-CSDN博客
B站讲解:Bilibili
更新版:
如图所示,实现了学生管理系统的增,删,改,查,排序
1.增:点击增加添加按钮之后会弹出另一个子类对话框
实现将编辑框中的内容添加到list control中,同时点击“录入”按钮之后,会提示录入成功
如果没有将子类对话框的信息没有填完整,会提示添加失败,如图
2.删:点击删除按钮 之后会直接删除掉该条信息,但是没有提示
选中小王的那一条消息,点击删除删除后的列表框如图所示
3.改 :点击列表框中的某一条信息,会在右侧编辑框中实时显示出来,如果你想修改某条信息,直接在编辑框里修改,修改之后按下“修改”按钮
会出现这个提示,如果点击“是 ”修改同步到列表框中,选择否则取消修改操作
4.查:有两种查找方式,一种是查找姓名,另一种是查找学号,无论是哪种方法,点击查找之后在列表框中表示高亮,但是编辑框没有变化。
根据日常习惯,数学,语文,外语,平均分这四项都是降序排列。
6.文件的保存分为从所有文件里打开,另存为。和指定某个文件的打开和保存
另存为和打开就是平常保存和打开文件的框框。
7.关闭应用:
如果没有保存就会提示出没有保存是否退出
粘一下头文件的控件,函数
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
}
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!");
}
这个东西也是我参照了好多大佬的资料添加的修改的。
后期也会再添加功能的,这次就先写这么多。
希望能够帮到大家吧。