信息科学与工程学院 报告书
专 业:计算机科学与技术 课程 名称:《VC++实训》 题 目:学生信息管理系统 班 级: 设 计 者: 完 成 时 间:
总 成 绩 教师签名
学生信息管理系统
一 系统总体方案
系统基本实现了对学生信息的查询,添加,修改,删除,保存功能。
二 设计思路和主要步骤
思路主要是设计一个单文档用来实现主界面,然后在菜单栏添加一个菜单项,下面包含录入学生基本信息,查询学生基本信息,和修改学生基本信息等多项子菜单,每项子菜单都对应一个对话框对数据进行处理。在主对话框中添加列表控件用来显示学生的基本信息,以方便学生信息的修改,具体修改哪一项。对于学生信息的录入,查询,修改,删除都用按钮控件,并为每个按钮添加消息响应函数用来处理学生的信息操作。
接下来就是要把学生的基本信息能够保存下来,因此要用到文件的操作,fstream可以满足要求。
综上所述,必须先掌握按钮控件,列表控件,新对话框的构建,编辑控件和消息的响应与处理原理!
三 各功能模块和流程图
1.功能模块实现
主界面
对话框一
对话框2
对话框
3
四 设计代码
1.主体框架代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
TRACE0(\ return -1; // fail to create }
If(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))) {
TRACE0(\ return -1; // fail to create
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; }
void CMainFrame::OnMenuitemadd() {
CMyDlgAdd dlg1; dlg1.DoModal(); }
void CMainFrame::OnMenuitemmodify() {
CMyDlgModify dlg2; dlg2.DoModal(); }
void CMainFrame::OnMenuitemseek() {
CMyDlgSeek dlg3; dlg3.DoModal(); }
2.录入消息对话框的消息映射:
HBRUSH CMyDlgAdd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if(nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC) {
pDC->SetTextColor(RGB(0,0,255)); pDC->SetBkMode(TRANSPARENT); }
pDC->SetTextColor(RGB(0,0,255)); pDC->SetBkMode(TRANSPARENT); return hbr; }
void CMyDlgAdd::OnPaint()
{
CPaintDC dc(this); // device context for painting LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT)); lf.lfHeight=28;
lf.lfCharSet=GB2312_CHARSET;
strcpy((LPSTR)&(lf.lfFaceName),\华文新魏\ CFont cf;
cf.CreateFontIndirect(&lf); m_Title.SetFont(&cf); }
void CMyDlgAdd::OnOK() {
UpdateData();
struct Record *re=per; fstream file; CFile file1;
file.open(\ int nIndex=m_Speciality.GetCurSel();
int i=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO2); const int size=sizeof(struct Record);
if((re)->id==0||(re)->name==0||re->speciality==0||re->grade==0||i==0)
MessageBox(\输入不完整,不能提交!\ else {
strcpy((re)->id,m_Num); strcpy((re)->name,m_Name); CString str; int y,m,d;
y=m_Birth.GetYear(); m=m_Birth.GetMonth(); d=m_Birth.GetDay();
str.Format(\ strcpy(re->date,str); if(i==IDC_RADIO1) strcpy(re->sex,\男\ if(i==IDC_RADIO2)
strcpy(re->sex,\女\ if(nIndex==0)
strcpy(re->speciality,\计算机\ if(nIndex==1)
strcpy(re->speciality,\数学\ strcpy(re->grade,m_Grade); file<
file.close();
CDialog::OnOK();
MessageBox(\添加成功!\}
2.学生信息修改对话框消息映射: BOOL CMyDlgModify::OnInitDialog() {
CDialog::OnInitDialog(); UpdateData(false); const int nColumns=6;
m_list1.InsertColumn(0,\学号\ m_list1.InsertColumn(1,\姓名\ m_list1.InsertColumn(2,\性别\ m_list1.InsertColumn(3,\专业\ m_list1.InsertColumn(4,\年级\
m_list1.InsertColumn(5,\出生日期\
CRect rect4;
m_list1.GetClientRect(rect4); for(int i=0;i m_list1.SetColumnWidth(i,rect4.Width()/nColumns); fstream file; struct Record per; memset(&per,0,sizeof(struct Record)); file.open(\ if(!file) { MessageBox(\ } for(int j=0;!file.eof();j++) { file>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; m_list1.InsertItem(j,per.id); m_list1.SetItemText(j,1,per.name); m_list1.SetItemText(j,2,per.sex); m_list1.SetItemText(j,3,per.speciality); m_list1.SetItemText(j,4,per.grade); m_list1.SetItemText(j,5,per.date); strcpy(per.id,\ strcpy(per.name,\ strcpy(per.sex,\ strcpy(per.speciality,\ strcpy(per.grade,\ strcpy(per.date,\ } file.close(); ListView_SetExtendedListViewStyle(m_list1.m_hWnd,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置可以选整行 return TRUE; } void CMyDlgModify::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { UpdateData(); struct Record per; memset(&per,0,sizeof(struct Record)); CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_LIST1); ASSERT(pListCtrl != NULL); POSITION pos = m_list1.GetFirstSelectedItemPosition(); if(pos!=NULL) { nItem = m_list1.GetNextSelectedItem(pos); m_Id=m_list1.GetItemText(nItem,0); m_Name=m_list1.GetItemText(nItem,1); if(m_list1.GetItemText(nItem,2)==\男\ CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1); } *pResult = 0; } void CMyDlgModify::OnOK() { if(IDNO == MessageBox(\确定要修改吗?\提问\ { return ; } UpdateData(); fstream file1,file2; struct Record per; file1.open(\ file2.open(\ if(!file1||!file2) { MessageBox(\ return ; } int n =0 , m = 0; while(!file1.eof()) { n++ ; file1>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; } n--; m = n ; file1.close(); file1.open(\ int nIndex = m_list1.GetSelectionMark(); else CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO2); m_Speciality=m_list1.GetItemText(nItem,3); m_Grade=m_list1.GetItemText(nItem,4); m_Date=m_list1.GetItemText(nItem,5); m_Num.Format(\UpdateData(false); char id[20]=\ strcpy(id,m_list1.GetItemText(nIndex,0)); memset(&per,0,sizeof(struct Record)); while(n) { file1>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; if(strcmp(per.id,id) != 0 ) { file2< else //要修改的记录 { strcpy(per.id,m_Id); strcpy(per.name,m_Name); int i=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO2); if(i==IDC_RADIO1) { strcpy(per.sex,\男\ } if(i==IDC_RADIO2) { strcpy(per.sex,\女\ } strcpy(per.speciality,m_Speciality); strcpy(per.grade,m_Grade); strcpy(per.date,m_Date); file2< file1.close(); file2.close(); remove(\ rename(\ m_Num = \ m_Name = \ m_Speciality = \ m_Grade = \ UpdateData(FALSE); RefreshData(m); } void CMyDlgModify::RefreshData(int m ) { struct Record per; fstream file; file.open(\ memset(&per,0,sizeof(struct Record)); m_list1.DeleteAllItems(); m_list1.SetRedraw(FALSE); int i = 0 ; while( i < m ) { file>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; m_list1.InsertItem(i,per.id); m_list1.SetItemText(i,1,per.name); m_list1.SetItemText(i,2,per.sex); m_list1.SetItemText(i,3,per.speciality); m_list1.SetItemText(i,4,per.grade); m_list1.SetItemText(i,5,per.date); i++; } file.close(); m_list1.SetRedraw(TRUE); } 4.学生信息查找代码: void CMyDlgSeek::OnButton1() { UpdateData(); fstream file1,file2; struct Record per; file1.open(\ file2.open(\ if(!file1||!file2) { MessageBox(\ return ; } int n =0; while(!file1.eof()) { n++ ; file1>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; } n--; file1.close(); file1.open(\ char id[20]=\ strcpy(id,m_Num); memset(&per,0,sizeof(struct Record)); while(n) { file1>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; if(strcmp(per.id,id) != 0 ) { file2< if(IDNO == MessageBox(\确定要删除吗?\提问\ { return ; } file1.close(); file2.close(); remove(\ rename(\ m_Num = \ m_Name = \ m_Speciality = \ m_Grade = \ m_Birth = \ UpdateData(FALSE); } void CMyDlgSeek::OnButton2() {CDialog::OnCancel();} void CMyDlgSeek::OnOK() { UpdateData(); fstream file; file.open(\ struct Record per; int flag; if(!file) { MessageBox(\ return ; } flag=0; while(!file.eof()&&!flag) { file>>per.id>>per.name>>per.sex>>per.speciality>>per.grade>>per.date; if(m_Num==per.id) { m_Name=per.name; if(strcmp(per.sex,\男\ CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1); else CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO2); m_Speciality=per.speciality; m_Grade=per.grade; m_Birth=per.date; flag=1; } } } if(flag==0) MessageBox(\查无此人!\file.close(); UpdateData(false); 五 心得体会和参考资料 工程中还存在很多不足,不是很完善。 通过工程的构思,构建,到模块的实现,最后代码的编写,以及令人头痛的改错过程。制作中不断遇到新问题,自己努力去看书,去图书馆查询资料,实在不会就去请教学的比较好的同学,大家一起思考怎么解决一个个难题,不断的错误,不断的更正,有点摸着石头过河的意思。自己也发现了自己还存在许多问题,但是在工程的制作中,我觉得我很有收获,对各方面的知识有了新的认识,有了更加深刻的理解,增加了自己的构建工程能力,提高自己解决问题的能力。在以后的生活中,要自己主动去做一些工程,因为我觉得在工程项目中可以学习到很多知识和经验,可以实实在在得提高自己的能力。 参考资料:《Visual C++》 郑阿奇主编 清华大学出版社