1、 EnableMenuItem(3,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);【步骤3】在CMainFrame中添加自己定义的函数void SetMenuSta(int type),此函数在登陆对话框的OnOK()中被调用,即当用户进入系统后使“进入系统”菜单项不可用,并根据用户类型使相应菜单可用。当类型为1时(学生),使“学生权限”菜单可用;当类型为2时(教师),使“教师权限”菜单可用;当类型为3时,使“管理员”菜单可用。void CMainFrame:SetMenuSta(int type)AfxGetMainWnd()-EnableMenuItem
2、(0,MF_BYPOSITION | MF_DISABLED | MF_GRAYED); if(type=1) EnableMenuItem(1,MF_BYPOSI TION | MF_ENABLED);/在上面的OnCreate中可以直接通过GetMenu()对菜单操作, /但这里却必须先通过AfxGetMainWnd()获得主窗体指针, /浪费了我一晚上时间,虽然解决了,但还不知道为什么。 if(type=2) AfxGetMainWnd()-EnableMenuItem(2,MF_BYPOSITION | MF_ENABLED); if(type=3)EnableMenuItem(3,M
3、F_BYPOSITION | MF_ENABLED);【步骤4】通过上面两步并不能按我们的想法实现菜单变灰的操作,运行系统各菜单都是可用的,我们必须在CMainFrame的构造函数中添加下面一句代码:m_bAutoMenuEnable=FALSE; m_bAutoMenuEnable必须放在CMainFrame()里初始化,不可用放在登陆对话框的OnOK()函数中,要不其他三个菜单可用变灰,但“进入系统”菜单项却总是不能变灰。数据库设计:根据以上思路,我们使用SQL数据库建立一个“学生成绩管理系统”,其下有4张表,分别为用户表USERS、学生成绩表COURSE_SCORE、学生信息表STUDE
4、NT_INFO和教师信息表TEACHER_INFO。表1 用户表USERS字段名 类型 长度 说明USER_ID char 20 用户名USER_PASSWORD char 20 密码USER_TYPE int 4 1为学生,2为教师,3为管理员表2 学生成绩表COURSE_SCORE字段名 类型 长度 说明STU_ID char 10 学生ID,系统中学生的唯一标识COURSE_ID char 10 课程号,系统中课程的唯一标识COURSE_NAME char 10 课程名SCORE int 4 课程分数表3 学生信息表STUDENT_INFO字段名 类型 长度 说明STU_ID char
5、10 学生ID,系统中学生的唯一标识STU_NAME char 10 学生姓名ENROLLMENT_TIME datetime 8 入学时间DEPARTMENT char 20 所在学院MAJOR char 20 所在专业SEX int 4 性别:0表示男,1表示女BIRTHDAY datetime 8 生日HOMETOWN varchar 50 籍贯ADDRESS varchar 50 现在住址PHONE char 20 个人电话号码RACE char 10 民族PARTY int 4 政治面貌:0表示党员,1表示预备党员,2表示团员,3表示其他 DIRECTION varchar 50 其
6、他信息具体实现步骤:(一)登陆模块设计1、当刚进入系统时候,用户点击“进入系统”菜单项后系统界面如下:按上面的登陆对话框摆放好控件,其中各个控件ID及对应变量如下图所示:从上图中也可以看出,我们为该登陆对话框建立了个新类:CLoginDlg,它的具体创建过程就不介绍了。2、因为登陆对话框要使用SQL数据库中的USERS表,所以需要在程序中添加类CLoginSet,步骤如下:【步骤1】在项目名“学生成绩管理系统”上单击鼠标右键,在弹出的New Class对话框中的Name文本框中输入CLoginSet,在Base class下拉文本框中选择CRecordset。【步骤2】单击OK按钮,弹出Dat
7、abase Option对话框,在ODBC下拉文本框中选择“学生成绩管理系统”数据库,单击OK按钮,弹出Select Database Tables对话框,选择dbo.USERS选项,单击OK按钮。这样就建立了一个CRecordset的对象,就可以对数据库中的USERS表进行操作了。3、在LoginDlg.cpp中引入头文件LoginSet.h,将CRecordSet对象CLoginSet引入登陆对话框: #include “LoginSet.h”4、声明全局变量。在学生成绩管理系统.cpp文件中添加如下代码:/ CDatabase型变量,用于连接数据库CDatabase m_database
8、;/学生登陆后在系统中的唯一ID值CString m_ID;在LoginDlg.cpp添加如下语句,使用已经声明过的全局变量(记得在以后的每个模块中都要添加):extern CDatabase m_database;extern CString m_ID;5、为登陆对话框的“确定”按钮添加消息代码,如下:void CLoginDlg:OnOK() BOOL bLogin=FALSE;CLoginSet *m_recordset=new CLoginSet(&m_database); CString strSQL;UpdateData(TRUE);if(m_usetype.Compare(学生)
9、=0)type=1;elseif(m_usetype.Compare(教师type=2;elseif(m_usetype.Compare(管理员type=3;strSQL.Format(select * from USERS where USER_ID=%s AND USER_PASSWORD= AND USER_TYPE=%d,m_useID,m_usepassword,type);m_recordset-Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(m_recordset-GetRecordCount()=0)if(countGetFieldValue(U
10、SER_ID,m_ID);bLogin=TRUE;if(bLogin)MessageBox(欢迎进入学生成绩管理系统!EndDialog(IDOK);CMainFrame *mainfrm=new CMainFrame();mainfrm-SetMenuSta(type); m_database.Close();/CDialog:OnOK(); 6、为登陆菜单下的“进入系统”添加响应函数,此函数是在CMainFrame类中添加的,代码如下:OnLogin() / TODO: Add your command handler code hereCLoginDlg login; login.DoM
11、odal();(二)学生成绩查询模块设计 1、 如果用户类型是1,即学生时,用户可以查询自己的成绩。 在其中用户可以根据课程号或者课程名查询自己的成绩。按上面的学生成绩查询对话框摆放好控件,其中各个控件ID及对应变量如下图所示:从上图中也可以看出,我们为该学生成绩查询对话框建立了个新类:CStuCheckScoreDlg,它的具体创建过程就不介绍了。2、因为学生成绩查询对话框要使用SQL数据库中的COURSE_SCORE表,所以需要在程序中添加类CCourseScoreSet,步骤如下:【步骤1】在项目名“学生成绩管理系统”上单击鼠标右键,在弹出的New Class对话框中的Name文本框中输
12、入CCourseScoreSet,在Base class下拉文本框中选择CRecordset。【步骤2】单击OK按钮,弹出Database Option对话框,在ODBC下拉文本框中选择“学生成绩管理系统”数据库,单击OK按钮,弹出Select Database Tables对话框,选择dbo. COURSE_SCORE选项,单击OK按钮。这样就建立了一个CRecordset的对象,就可以对数据库中的COURSE_SCORE表进行操作了。3、在StuCheckScoreDlg.cpp中引入头文件CourseScoreSet.h,将CRecordSet对象CCourseScoreSet引入登陆对
13、话框: #include “CourseScoreSet.h”4、 在StuCheckScoreDlg.cpp添加如下语句,使用已经声明过的全局变量(记得在以后的每个模块中都要添加):5、为学生成绩查询模块的“查询”按钮添加响应事件:void CStuCheckScoreDlg:OnCheckButton() CString strSQL;CDBVariant varValue;if(m_keyword.Compare(课程号select * from COURSE_SCORE where COURSE_ID=,m_cost); elseselect * from COURSE_SCORE w
14、here COURSE_NAME=CCourseScoreSet *m_recordset=new CCourseScoreSet(&对不起,没有您所需要的结果,请核对后重新输入!int temp=0;m_stuID=m_recordset-m_STU_ID;m_courseID=m_recordset-m_COURSE_ID;m_coursename=m_recordset-m_COURSE_NAME;m_score=m_recordset-m_SCORE;Close();UpdateData(FALSE);注意:在上面我们对对话框中各个文本框对应的变量进行赋值时,并不是使用 m_recor
15、dset-GetFieldValue(3,varValue); m_coursename=varValue.m_pstring-GetBuffer(1);不用这么麻烦的写法,直接用m_recordset中的变量就行了,m_recordset中的变量对应这数据库表中的各个字段,且和表中字段类型都一致。(三)教师操作学生成绩信息模块设计 1、 如果用户类型是2,即教师时,用户可以查询学生的成绩,还可以对学生成绩进行增、改、删操作。查询学生成绩和上个模块差不多,就不做了。而对学生成绩的增、改、删操作就是通过这个模板实现的。界面如下:在其中的列表控件中显示COURSE_SCORE中所有的信息,并且当用
16、户点击其中一行时,可以在上面的文本框中进行显示。按上面的对话框摆放好控件,其中各个控件ID及对应变量如下图所示:从上图中也可以看出,我们为该教师操作学生成绩对话框建立了个新类:COperateScore,它的具体创建过程就不介绍了。2、因为教师操作学生成绩对话框也要使用SQL数据库中的COURSE_SCORE表,所以需要在OperateScore.cpp中引入在前面创建的COURSE_SCORE表所对应的记录集对象的头文件CourseScoreSet.h,将CRecordSet对象CCourseScoreSet引入登陆对话框:3、 在OperateScore.cpp添加如下语句,使用已经声明过
17、的全局变量(记得在以后的每个模块中都要添加):4、因为该对话框中含有列表控件,我们需要对其进行初始化,让列表控件一开始就显示COURSE_SCORE表中的所有记录,并且把列表控件中的第一条记录显示在上面的文本框中。 【步骤1】右键点击COperateScore,在弹出的菜单中选择“Add windows message handle”项,然后在弹出的对话框的“新建windows消息/事件”中选择“WM_INITDIALOG”,然后点击“Add Handle”按钮,最后点击“Edit Existing”按钮,编写代码如下:BOOL COperateScore:OnInitDialog() CDi
18、alog:OnInitDialog();m_listscore.InsertColumn(0,学号 m_listscore.InsertColumn(1, m_listscore.InsertColumn(2,课程名 m_listscore.InsertColumn(3,成绩 RECT rect; m_listscore.GetWindowRect(&rect); int width=rect.right-rect.left; m_listscore.SetColumnWidth(0,width/4); m_listscore.SetColumnWidth(1,width/4); m_list
19、score.SetColumnWidth(2,width/4); m_listscore.SetColumnWidth(3,width/4); m_listscore.SetExtendedStyle(LVS_EX_FULLROWSELECT); initial(); Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE 【步骤2】在上面的OnInitDial
20、og()函数中我们设置了列表控件的表头和每列的间距,并在最后调用了initial()函数。initial()是我自定义的一个函数,用来将COURSE_SCORE表中的数据全部在该列表控件中显示出来。该函数是自定义函数,添加过程比较简单,不介绍。代码如下:void COperateScore:initial()m_listscore.DeleteAllItems(); CDBVariant varValue204;CCourseScoreSet m_recordset; int j=m_recordset.GetDatebase(varValue);int k;int i=0; char buf
21、20;for(k=0;kGetBuffer(1);m_listscore.SetItemText(i,1,varValuek1.m_pstring-m_listscore.SetItemText(i,2,varValuek2.m_pstring-/用来处理数据表中的整型字段sprintf(buf,%d,varValuek3.m_iVal);m_listscore.SetItemText(i,3,buf);i=0;settext(0);varValue204是CDBVariant型的,该类型的变量可以用来存储数据表中任意类型的字段,所在在数据库操作时用该变量比较方便。变量j表示COURSE_SC
22、ORE数据表中的行数,通过for循环把该数据表中的所有记录全部显示出来。数据表中的前3个字段我都是用varValuek0.m_pstring-GetBuffer(1)来显示在列表控件中,是因为数据表中前3个字段都是字符型的,而最后一个字段是用来显示分数的,该字段在数据表中我定义为了整型,所有用sprintf(buf, m_listscore.SetItemText(i,3,buf);来显示。【步骤3】在上面的initial()函数中我调用了GetDatebase(varValue)函数,该函数返回COURSE_SCORE数据表中的记录条数,我们将其赋给了j。并且该函数把COURSE_SCORE表中所有记录都存储在二维数组varValue中。在前面两个模块中我对数据库操作都是直接在该模块中操作的,但现在我要换种方法。我把对数据库的操作封装在了记录集类CCourseScoreSet中,
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2