MFC开发学生信息管理系统(详细)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学生信息管理系统(一)用microsoft office access创建一个数据库student.mdb
(图1.1)
在表中添加字段和数据类型,如下图所示:
(图1.2)
(图1.3)
(图1.4)
创建ODBC数据源
选择控制面板→管理工具→数据源(ODBC)→系统DSN标签→单击“添加”
出现下图所示的界面。
选择Drive do Microsoft Access (*.mdb),单击“完成”。
输入数据源名,单击“选择、、、”,选择c/student.mdb 单击“确定”,将会出现如图(图1.7)所示。
(图1.5)
(图1.6)
(图1.7)
(二).MFC图形建立
(图2.1)
特别注意:创建的应用程序类型是单文档(single document应用程序)
(图2.2)
将CSTUDXINXIView 的基类改为CScrollView 然后单击“完成”。
(图2.3)
为数据表创建CRecordSet用户类
按“Ctrl+W ”进入“建立类向导(即MFC ClasWizard)”单击“Add Class...”选择“New...”如图(图2.4)所示.按照(图2.5)→(图2.6)→(图2.7)的安装顺序。
即可完成创建CRecordSet用户类的工作。
(图2.4)
(图2.5)
(图2.6)
(图2.7)
在stdafx.h文件中添加CRecordSet包含语句:#include<afxdb.h> 如图(图2.8)所示
(图2.8)
(三)构建班级信息对话框类
按“Ctrl+R”键,打开“插入资源”,选择dialog(对话框),选择新建。
将名字改为IDD_CLASSINFO,标题为“班级信息输入”。
按照(图3.1)添加控件。
添加的控件ID号标题其他属性
编辑框(班级号)IDC_EDIT_CLASSNO 默认
编辑框(所在院系)IDC_EDIT_DEPART 默认
编辑框(专业)IDC_EDIT_SPECIAL 默认
组合框(学制)IDC_COMBO_YEAR 默认
日期/时间控件(入学时间)IDC_DATETIMEPICKER1 默认
对于学制框:使用Data页面来添加数据项,按Ctrl+Enter 换行。
(图3.1)
完成控件添加后,选择“建立类向导”,创建一个新类、即CClassInfoDlg,如图(3.2)所示。
然后按照下图,为控件添加成员变量。
(图3.2)
(图3.3)
控件ID号变量类别变量类型变量名
IDC_EDIT_CLASSNO Value CString m_strClassNO IDC_EDIT_DEPART Value CString m_strDepart IDC_EDIT_SPECIAL Value CString m_strSpecial IDC_COMBO_YEAR Value CString m_strYear IDC_DATETIMEPICKER1 Value CTime m_tEnter
(图3.4)
使用类向导为CClassInfoDlg类添加WM_INITDIALOG消息映射。
代码位于附录1。
见(图3.5)
使用类向导为CClassInfoDlg类添加IDOK按钮的BN_CLICKED消息映射。
代码位于附录2。
见(图3.6)
(图3.5)
(图3.6)
鉴于添加代码都是从类向导找到相应的代码区域,以后就不详细截图了。
(四)实现班级基本信息添加和显示功能
为CSTUDXINXIView类添加一个LOGFONT型成员变量m_lfFont
选择Add Member Variable... 出现(图4.1)所示输入下面表格的变量类型和名称即可。
连续三次。
变量类型变量名称
LOGFONT m_lfFont
CString m_strClassNO
CString m_strSQL
在CSTUDXINXIView::CSTUDXINXIView() 添加代码。
代码位于附录3.
(图4.1)
添加一个成员函数
如(图4.2)所示。
(图4.2)
添加代码,位于附录4.
在STUDXINXIView.cpp文件的前面添加CClassInfo类的包含语句:#include"ClassInfoSet.h" 打开菜单资源,添加如(图4.3)所示的菜单项。
(图4.3)
用类向导为CSTUDXINXIView类添加该菜单项的COMMAND消息映射,并添加代码。
代码位于附录5
在CSTUDXINXIView::OnDraw 函数添加代码。
代码位于附录6
在STUDXINXIView.cpp文件的前面添加ClassInfoDlg类的包含语句:#include"ClassInfoDlg.h"
(五)查询班级信息
添加一个新的对话资源框,名字改为ID_SEEKCLASS 标题定为“查询班级信息”。
按照下面的表格添加控件。
布局如(图5.1所示)
添加的控件ID号标题其他属性
单选按钮(按所在院系)IDC_RADIO1 默认
单选按钮(按专业)IDC_RADIO2 默认编辑框IDC_EDIT1 默认
(图5.1)
建立新类,为IDC_EDIT1添加一个CString型变量m_strSeek
为CSeekClassDlg类添加消息映射,代码位于附录7
为CSeekClassDlg类添加CString型成员变量m_strSQL
用类向导为IDOK按钮添加消息映射。
代码位于附录8
打开菜单资源,添加菜单项如(图5.2)所示。
用类向导添加消息映射。
代码位于附录9
在STUDXINXIView.cpp文件的前面添加包含语句:#include"SeekClassDlg.h"
(图5.2)
运行,编译。
附录:
1
m_strYear="4"; //有关于消息映射
UpdateData(FALSE);
2
UpdateData();
m_strClassNO.TrimLeft();
m_strDepart.TrimLeft();
m_strSpecial.TrimLeft();
if(m_strDepart.IsEmpty())
MessageBox("必须要有所院系!");
else if(m_strSpecial.IsEmpty())
MessageBox("必须要有班级!");
else
if(m_strClassNO.IsEmpty())
MessageBox("必须要有班级号!");
else
3
memset(&m_lfFont,0,sizeof(LOGFONT));
m_lfFont.lfHeight=12;
m_lfFont.lfCharSet=GB2312_CHARSET;
strcpy(m_lfFont.lfFaceName,"宋体");
m_strClassNO=m_strSQL="";
4
CFont font;
LOGFONT lf=m_lfFont;
lf.lfWeight=700;
strcpy(lf.lfFaceName,"幼圆");
font.CreateFontIndirect(&lf);
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int nLineHeight=(int)((tm.tmHeight+tm.tmExternalLeading)*1.5);
//行高为1.5倍字符高度
int x=0,y=0,nWidth;
CFont*oldFont=pDC->SelectObject(&font); //使用新字体
//输出表头
CString strHeader[]={"班级号","所在院系","专业名称","学制","入学时间"};
int nStrWidth[]={10,25,25,8,10};
CClassInfoSet cSet;
cSet.m_strFilter=strSQL;
cSet.Open();
for(UINT i=0;i<cSet.m_nFields;i++)
{
//计算每一个字段所需的长度
nWidth=tm.tmAveCharWidth*nStrWidth[i];
pDC->TextOut(x,y,strHeader[i]);
x+=nWidth;
}
pDC->SelectObject(oldFont);
.
//显示具体内容
CString str;
while(!cSet.IsEOF())
{
if(strClass==cSet.m_classno)
{
//这是要强调显示的班级
lf.lfWeight=0;
strcpy(lf.lfFaceName,"楷体_GB2312");
font.DeleteObject();
font.CreateFontIndirect(&lf);
pDC->SelectObject(&font);
}
else
pDC->SelectObject(oldFont); //使用原来的字体
x=0;y+=nLineHeight;
for(UINT i=0;i<cSet.m_nFields;i++)
{
cSet.GetFieldValue(i,str);
//计算每一个字段需要的长度
nWidth=tm.tmAveCharWidth*nStrWidth[i];
pDC->TextOut(x,y,str);
x+=nWidth;
}
cSet.MoveNext();
}
cSet.Close();
//设置视图滚动大小
CSize sizeTotal;
sizeTotal.cx=x+nWidth; sizeTotal.cy=y+nLineHeight;
SetScrollSizes(MM_TEXT,sizeTotal);
5
CClassInfoDlg dlg;
if(dlg.DoModal()!=IDOK) return;
//向classinfo表添加新的记录,为了防止添加相同的记录,这里先来判断
CClassInfoSet infoSet;
infoSet.m_strFilter.Format("classno='%s' AND depart='%s'",dlg.m_strClassNO,dlg.m_strDepart,dlg.m_strSpecial);
infoSet.Open();
if(!infoSet.IsEOF())
{
MessageBox(dlg.m_strClassNO+"班级记录已被添加过!!! "); //
if(infoSet.IsOpen()) infoSet.Close();
return;
}
if(infoSet.IsOpen())
infoSet.Close();
CClassInfoSet addSet;
if(addSet.Open())
{
//添加一个新的记录
addSet.AddNew();
addSet.m_classno=dlg.m_strClassNO;
addSet.m_depart=dlg.m_strDepart;
addSet.m_special=dlg.m_strSpecial;
addSet.m_studyyear=(float)atof(dlg.m_strYear);
addSet.m_entertime=dlg.m_tEnter;
addSet.Update();
addSet.Requery();
}
if(addSet.IsOpen())
addSet.Close();
//更新视图
m_strClassNO=dlg.m_strClassNO; m_strSQL="";
MessageBox("稍等几分钟后,单击“确定”按钮!O(∩_∩)O谢谢","特别提示",MB_OK|MB_ICONINFORMA TION);
Invalidate(); //重新调用OnDraw
6
CFont font;
font.CreateFontIndirect(&m_lfFont);
CFont*oldFont=pDC->SelectObject(&font);
DispClassInfo(pDC,m_strClassNO,m_strSQL);
pDC->SelectObject(oldFont);
7
CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);
8
UpdateData();
m_strSeek.TrimLeft();
if(m_strSeek.IsEmpty())
{
MessageBox("查询内容不能为空!");
return;
}
int nID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO2);
if(nID==IDC_RADIO1)
m_strSQL.Format("depart='%s'",m_strSeek);
else
m_strSQL.Format("special='%s'",m_strSeek);
9
CSeekClassDlg dlg;
if(dlg.DoModal()==IDOK) {
m_strClassNO="";
m_strSQL=dlg.m_strSQL;
Invalidate();
}。