学生信息管理应用程序.docx
《学生信息管理应用程序.docx》由会员分享,可在线阅读,更多相关《学生信息管理应用程序.docx(26页珍藏版)》请在冰点文库上搜索。
学生信息管理应用程序
V
C
课
程
设
计
报
告
学生信息管理应用程序设计报告
一、实验目的与要求
1.实验目的:
目的是了解程序设计语言的基础知识,掌握MFC应用程序的基本知识,掌握面向对象程序设计的基本思路和方法,掌握用VC++开发应用程序的的一般步骤和方法。
2.实验要求:
能够利用所学的基本知识,设计一个简单的学生信息管理应用程序,具有以下功能:
1、实现学生信息的存储,用文件来实现。
2、编程实现学生信息的添加、删除、修改、浏览和查询等功能。
二、完成情况
学生信息管理应用程序包括了学生的基本信息。
在本程序中每个学生的信息有:
学号、姓名、性别、等。
本程序以一个单文档的形式实现了学生信息的存储(用文件来实现)和学生信息的添加、删除、修改、浏览和查询等功能。
并当用户单击这些按钮时会根据用户的操作(学号是否重号,姓名是否为空,名字是否为空等)反馈给用户一个信息,以显示用户的这一次操作的合理性。
三、实验的基本思路
总体来说本程序的基本思路是:
程序中利用了表单视图和列表视图(以这两个视图来静态切分窗口),程序中的数据传输是通过Cdocument:
:
UpdateAllViews和Cview:
:
OnUpdate的相互作用来实现的,而且为了避免传输的相互干涉,采用提示号来区分,即给1Hint变量赋予不同的值,程序代码会根据1Hint的值的不同执行不同的代码,并使数据显示出来。
在实现保存功能时用到了简单数组集合类,并利用了CstringArray序列化的一个内部机制实现数据的保存。
打开一个已经保存过的文件时通过1Hint值的判断来执行一个双循环,通过此双循环代码可以让一个由简单数组集合类定义的变量中的数据读取出来,并在列表视图中显示。
为了实现一个列表项基本信息在左面的表单视图的控件中显示,需要视图和文档数据的交换,此程序以在Doc类中事先定义好的变量为媒介,通过给这些变量赋值来实现数据在文档和视图之间的回传。
四、设计的步骤及主要代码
首先为此程序(工程名为TiMu1)创建一个表单视图,在用MFCAppWizard创建的第六步中选择CFormView作为文档应用程序视图类的基类。
然后再添加一个CListView类的派生类,派生类名为CListCtrlView,此派生类将在切分窗口使用到。
还有一点很重要,要使添加的派生类正确编译,那么必须在StdAfx.h头文件中有下列语句才能保证程序正确编译。
#inciude”afxcview.h”
为CmainFrame添加OnCreateClient消息映射和和一个CsplitterWnd形的变量,变量名为m_wndSplitter,并在函数中添加如下代码:
BOOLCMainFrame:
:
OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext)
{
ModifyStyle(0,WS_VSCROLL,0);//让窗口有水平,垂直滚动条
ModifyStyle(0,WS_HSCROLL,0);
CRectrect;
GetWindowRect(&rect);
m_wndSplitter.CreateStatic(this,1,2);//静态切分窗口m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTiMu1View),CSize(0,0),pContext);//为相应的窗格指定一个视图类
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListCtrlView),CSize(0,0),pContext);
m_wndSplitter.SetColumnInfo(0,rect.Width()/3,10);//设置窗格的宽度.
m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);
m_wndSplitter.RecalcLayout();//重新布局
returnTRUE;
returnCFrameWnd:
:
OnCreateClient(lpcs,pContext);
}
在表单视图中添加程序所需要的几个控件并在类向导中设置控件的关联变量,再为各个按钮控件(添加、删除、修改、浏览和查询)映射BN_CLICKED(单击)消息映射,取默认的函数名。
各个函数中添加的代码如下:
添加功能:
voidCTiMu1View:
:
OnButtonAdd()
{
UpdateData();
m_strName.TrimLeft();
m_strNo.TrimLeft();
if(m_strName.IsEmpty())
{
MessageBox("必须要有姓名!
");
return;
}
if(m_strNo.IsEmpty())
{
MessageBox("必须要有学号!
");
return;
}
CTiMu1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->no=m_strNo;
pDoc->name=m_strName;
pDoc->age=m_strAge;
if(m_bMale)
pDoc->sex="男";
else
pDoc->sex="女";
//下面的代码传递一个“1”的消息
//以实现调用CListCtrlView函数中的OnUpdate函数
//并通过判断lHint的值为1来实现表单控件的数据
//在列表里显示
pDoc->UpdateAllViews(NULL,1,NULL);
//下面的代码是在要添加的数据在右面的列表中显示后,使左面的控件恢复“空白”的状态,以方便用户的下一次添加数据
m_strNo="";
m_strName="";
m_strAge="";
UpdateData(FALSE);
}
删除功能:
voidCTiMu1View:
:
OnButtonDel()
{
CTiMu1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
/*下面的代码传递一个“2”的消息以实现调用CListCtrlView函数中的OnUpdate函数并通过判断lHint的值为2来实现在列表里删除一个列表项的信息*/
pDoc->UpdateAllViews(NULL,2,NULL);
}
修改功能:
voidCTiMu1View:
:
OnButtonXiugai()
{
CTiMu1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
/*下面的代码传递一个“3”的消息以实现调用CListCtrlView函数中的OnUpdate函数并通过判断lHint的值为3来实现在列表里修改一个列表项的信息并把修改后的信息覆盖到原来的那个列表项上*/
pDoc->UpdateAllViews(NULL,3,NULL);
}
查询功能:
voidCTiMu1View:
:
OnButtonChaxun()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTiMu1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
/*下面的代码传递一个“4”的消息以实现调用CListCtrlView函数中的OnUpdate函数并通过判断lHint的值为4来实现在列表里查询一个列表项的信息并通过弹出一个对话框显示所要查询的一个学生信息*/
pDoc->UpdateAllViews(NULL,4,NULL);
}
浏览功能:
voidCTiMu1View:
:
OnButtonLiulan()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTiMu1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->UpdateAllViews(NULL,5,NULL);
}
说明:
上面的代码传递一个“n”(n为int形变量并根据不同的函数取不同的值)的消息以实现调用CListCtrlView函数中的OnUpdate函数,并通过判断lHint的值来实现在列表里添加、删除、修改、浏览或查询一个列表项的信息。
UpdateAllViews(NULL,n,NULL)函数所传递的1Hint的不同的值需要一个相应的函数用来接收和判断的值,并通过1Hint值的不同执行不同的代码,这样的函数需要在ClistCtrlView类中映射OnUpdate消息来实现,函数的代码为:
voidCListCtrlView:
:
OnUpdate(CView*pSender,LPARAMlHint,CObject*pHint)
{
CListCtrl&m_ListCtrl=GetListCtrl();
m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);/*设置在单击列表项时,整行选择。
下面的代码是利用1Hint的不同的值来建立数据的传输在视图中根据1Hint的值做出不同的动作,并在每个if语句中通过一个for循环使列表中的数据保存到一个简单数组集合类中,即保存到了在Doc类中定义的CStringArraym_strContents对象中。
在每次调用保存代码时,必须调用pDoc->m_strContents.RemoveAll();语句以使m_strContents对象中数据清零,防止在保存后,然后在打开时数据出现错误*/
//这句话在出现错误后,好久才想出来!
!
if(lHint==1)
{
CTiMu1Doc*pDoc=(CTiMu1Doc*)GetDocument();
ASSERT_VALID(pDoc);
//m_ListCtrl.DeleteAllItems();
LVFINDINFOinfo;
info.flags=LVFI_PARTIAL|LVFI_STRING;
info.psz=pDoc->no;
if(m_ListCtrl.FindItem(&info)!
=-1)
{
CStringstr;
str.Format("不能添加学号相同的学生信息!
\n学号为“%s”的学生基本信息已添加过!
",pDoc->no);
MessageBox(str,"警告",MB_ICONSTOP|MB_OKCANCEL);
return;
}
m_ListCtrl.InsertItem(0,"");
m_ListCtrl.SetItemText(0,0,pDoc->no);
m_ListCtrl.SetItemText(0,1,pDoc->name);
m_ListCtrl.SetItemText(0,2,pDoc->sex);
m_ListCtrl.SetItemText(0,3,pDoc->age);
CStringstr1=pDoc->no;
CStringstr2;
str2.Format("添加了学号为“%s”的学生信息!
\n\t添加成功!
\n\t",str1);
MessageBox(str2,"添加结果",MB_ICONWARNING|MB_OKCANCEL);
intnCount=m_ListCtrl.GetItemCount();
pDoc->m_strContents.RemoveAll();
/*这句话的作用是使m_strContents对象中数据清零,防止在保存后,然后在打开时数据出现错误*/
for(intn=0;n{
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,0));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,1));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,2));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,3));
}
pDoc->SetModifiedFlag(TRUE);//设置m_bModified的值为TRUE。
}
if(lHint==2)
{
CDelDlgdeldlg;
if(IDOK!
=deldlg.DoModal())return;
deldlg.m_strDelNo.TrimLeft();
if(deldlg.m_strDelNo.IsEmpty())
{
MessageBox("必须要有学号!
","警告",MB_ICONSTOP|MB_OKCANCEL);
return;
}
LVFINDINFOinfo;
info.flags=LVFI_PARTIAL|LVFI_STRING;
info.psz=deldlg.m_strDelNo;
if(m_ListCtrl.FindItem(&info)!
=-1)
{
intnDel=m_ListCtrl.FindItem(&info);
m_ListCtrl.DeleteItem(nDel);
CStringstr;
str.Format("删除了学号为“%s”的学生信息!
\n\t删除成功!
",deldlg.m_strDelNo);
MessageBox(str,"删除结果",MB_ICONWARNING|MB_OKCANCEL);
}
else
{
CStringstr2;
str2.Format("没有学号为%s的学生基本信息!
",deldlg.m_strDelNo);
MessageBox(str2,"?
?
?
",MB_ICONQUESTION|MB_OKCANCEL);
return;
}
CTiMu1Doc*pDoc=(CTiMu1Doc*)GetDocument();
ASSERT_VALID(pDoc);
intnCount=m_ListCtrl.GetItemCount();
pDoc->m_strContents.RemoveAll();
for(intn=0;n{
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,0));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,1));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,2));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,3));
}
pDoc->SetModifiedFlag(TRUE);//设置m_bModified的值为TRUE。
}
if(lHint==3)
{
CXiuGaiDlgdlg;
if(IDOK!
=dlg.DoModal())return;
dlg.m_strXiuGaiNo.TrimLeft();
if(dlg.m_strXiuGaiNo.IsEmpty())
{
MessageBox("必须要有学号!
","警告",MB_ICONSTOP|MB_OKCANCEL);
return;
}
LVFINDINFOinfo;
info.flags=LVFI_PARTIAL|LVFI_STRING;
info.psz=dlg.m_strXiuGaiNo;
intnXGai;
if(m_ListCtrl.FindItem(&info)!
=-1)
{
nXGai=m_ListCtrl.FindItem(&info);
//利用此函数返回所需要的一个列表项的索引号
}
else
{
CStringstr2;
str2.Format("没有学号为“%s”的学生基本信息!
",dlg.m_strXiuGaiNo);
MessageBox(str2,"?
?
?
",MB_ICONQUESTION|MB_OKCANCEL);
return;
}
MessageBox("请输入要修改的学生基本信息!
");
CStuInfoDlgdlg2;
if(IDOK!
=dlg2.DoModal())return;
LVFINDINFOinfo1;
info1.flags=LVFI_PARTIAL|LVFI_STRING;
info1.psz=dlg2.m_strNo;
if(m_ListCtrl.FindItem(&info1)!
=-1)
{
CStringstr;
str.Format("不能修改为学号相同的信息!
\n学号为“%s”的学生基本信息已存在!
\n\t修改失败!
",dlg2.m_strNo);
MessageBox(str,"警告",MB_ICONSTOP|MB_OKCANCEL);
return;
}
else
{
m_ListCtrl.DeleteItem(nXGai);
m_ListCtrl.InsertItem(nXGai,"");
m_ListCtrl.SetItemText(nXGai,0,dlg2.m_strNo);
m_ListCtrl.SetItemText(nXGai,1,dlg2.m_strName);
if(dlg2.m_bMale)
m_ListCtrl.SetItemText(nXGai,2,"男");
else
m_ListCtrl.SetItemText(nXGai,2,"女");
m_ListCtrl.SetItemText(nXGai,3,dlg2.m_strAge);
CStringstr1=dlg2.m_strNo;
CStringstr2;
str2.Format("修改了学号为“%s”的学生信息!
\n新学号为“%s”!
\n\t修改成功!
",dlg.m_strXiuGaiNo,str1);
MessageBox(str2,"修改结果",MB_ICONWARNING|MB_OKCANCEL);
}
CTiMu1Doc*pDoc=(CTiMu1Doc*)GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_strContents.RemoveAll();
intnCount=m_ListCtrl.GetItemCount();
for(intn=0;n{
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,0));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,1));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,2));
pDoc->m_strContents.Add(m_ListCtrl.GetItemText(n,3));
}
pDoc->SetModifiedFlag(TRUE);//设置m_bModified的值为TRUE。
}
if(lHint==4)
{
CChaXunDlgdlg;
if(IDOK!
=dlg.DoModal())return;
dlg.m_strChaXunNo.TrimLeft();
if(dlg.m_strChaXunNo.IsEmpty())
{
MessageBox("必须要有学号!
","警告",MB_ICONSTOP|MB_OKCANCEL);
return;
}
LVFINDINFOinfo;
info.flags=LVFI_PARTIAL|LVFI_STRING;
info.psz=dlg.m_strChaXunNo;
if(m_ListCtrl.FindItem(&info)!
=-1)
{
intnFinded=m_ListCtrl.FindItem(&info);
CStringstr1,str2,str3,str4,str;
str1=m_ListCtrl.GetItemText(nFinded,0);
str2=m_ListCtrl.GetItemText(nFinded,1);
str3=m_ListCtrl.GetItemText(nFinded,2);
str4=m_ListCtrl.GetItemText(nFinded,3);
str.Format("要查询的学生信息为:
\n\n学号:
%s\n\n姓名:
%s\n\n性别:
%s\n\n年龄:
%s\n\n查询成功!
",str1,str2,str3,str4);
MessageBox(str,"查询结果",MB_ICONWARNING|MB_OKCANCEL);
return;
}
else
{
CStringstr5;
str5.Format("没有学号为“%s”的学生基本信息!
",dlg.m_strChaXunNo);
MessageBox(str5,"?
?
?
",MB_ICONQUESTION|MB_OKCANCEL);
return;
}
}
if(lHint==5)
MessageBox("学生的基本信息已经全部显示在右边列表视图中!
\n\t\t请浏览!
");
if(lHint==6)
{
m_judge=FALSE;
/*设置m_judge为FALSE的目的是使程序在打开保存后的文档时不再调用CListCtrlView:
:
OnInitialUpdate()函数中的if语句中的代码以防止再次在列表中再添加一个标题头。
*/
m_ListCtrl.DeleteAllItems();//删除列表中的所有列表项
CTiMu1Doc*pDoc=(CTiMu1Doc*)GetDocument();
ASSERT_VALID(pDoc);
intnCount1=pDoc->m_strContents.GetSize();