资源描述
l 精品文档就在这里
l -------------各类专业好文档,值得你下载,教育,管理,论文,制度,方案手册,应有尽有--------------
l --------------------------------------------------------------------------------------------------------------------------------------------
基于MFC的个人管理系统的设计和实现
第一章、 绪论
考入自己理想的大学是每个学子的梦想,然而进入了大学,生活如何安排,未来如何面对成为了历届每个刚刚进入大学学生共同面对的问题。
很多学生在相对于高中更为宽松的管理中迷失了自我,失去了积极向上的动力,学习没有计划、生活作息紊乱、个人财务管理不合理,这一切一切的一切可能毁掉的不仅仅是本可以丰富多彩的大学生活,更为严重的是可能毁掉一个辛苦考入大学的大学生的一生。
为此,我们利用基于MFC面向对象相关技术编写了一个个人管理系统,并为之命名为“个人助理”,希望通过这个小软件可以让刚刚入学以及在自己大学生活中迷茫的大学生找到自己生活的方向,重新制定自己人生目标,使自己的学习生活计划更加合理、完善。
第二章、 软件开发平台及编程模式
在系统的设计与开发中,软件开发平台及编程模式是关键,下面介绍一下我们小组所使用的开发平台:Microsoft Visual C++及编程模式。
2.1 开发平台的选择
在Windows环境下,目前比较流行的可视化开发工具主要有:Visual C++、Visual Basic、C++ Builder、Delphi、Power Builder及JBuilder等。而本软件采用Microsoft Visual C++ 6.0作为开发工具,并使用MFC Application Framework作为本软件的基本架构。采用C++来进行编程的主要原因是,与Java和C#等现代编程语言相比,C++在程序运行的效率、内存使用的可控性和编程的灵活性上具有优势。
C++代码被编译成汇编语言,可以直接在处理器上运行,效率很高。而Java被编译成字节码,C#被编译成中间语言,都是不能在处理器上执行的,必须经过Java虚拟机或.NET通用语言运行时的JIT编译之后才能执行,因此效率较低。故从运行效率的角度看,采用C++进行编程比较合适。
对庞大的数据进行处理时需要使用大量的内存,而计算机的物理内存容量往往是有限的,因此需要有效地控制内存的使用。C++直接控制内存的分配和释放,这虽繁琐,且加大了编程的负担,但却能有效地控制内存的使用。Java和C#引进了垃圾收集机制,将开发人员从内存管理的繁杂任务中解放出来,不再需要直接控制内存的分配和释放。所以,从内存的使用效率来看,采用C++进行编程更合适。
C++中大量使用指针,使得编程的灵活性很高,这虽然增加了程序出错的可能性,但是便于程序员施展编程技巧来提高程序的效率。Java完全取消了指针,C#极大地限制了指针的使用,这都限制了程序员施展技巧。因此,使用C++进行图像处理编程具有更大的灵活性。而在以C++为核心语言的可视化编程工具中,Microsoft Visual C++ 6.0以其自身许多优异的特性而获得了最为广泛的应用。鉴于以上原因,本设计使用Microsoft Visual C++ 6.0作为软件的开发平台。
2.2 Microsoft Visual C++及编程模式简介
1. Visual C++可视化编程
Visual C++的资源编辑器能以所见即所得(What you see is what you get)的形式直接编辑程序的用户界面,为所有资源分配ID标识号。ClassWizard能把对话框模板与生成的类定义或与已有的类代码连接起来,为菜单项、控制等资源生成空的处理函数模板,创建消息映射条目,并将资源ID与处理函数连接起来。通过使用AppWizard,程序员的编程工作便简化为用资源编辑器直观的设计界面,完善对话框类代码,在空的处理函数模板处填写响应用户操作的代码,这是一种比较完善的可视化编程方法。
2. MFC(Microsoft Foundation Classes)应用程序框架
应用程序框架的一种定义是:提供一般应用程序需要的全部面向对象软件组件的集成集合。
C++流行的一个原因是它可以用类库扩充。类库是可在应用程序中使用的有关C++类的集合。应用程序框架是类库的超集。一般的类库只是一种孤立的类的集合,用来嵌入在任何程序中,但是,应用程序框架却定义了程序的结构。自从MFC库发布以来,MFC已经成为主要的Windows类库。使用MFC类库构建应用程序具有以下优点:
MFC库是C++的Microsoft Windows API。应用程序框架生成的应用程序使用了标准的结构,具有标准化的用户接口,这对具有标准用户界面的Win32程序来说,可以极大的减轻程序员的负担,以提高程序设计的效率。使用应用程序框架的应用程序不仅小,而且运行速度快,具有很大的灵活性。MFC封装了Win32 SDK中的几乎所有函数,能实现Win32系统的任何功能。
Visual C++工具降低了编码的复杂性。MFC库应用程序框架有丰富的特性,如:Windows API的C++接口、通用的(非Windows所特有的)类、“共用根对象”类层次结构、流线式多文档界面(MDI)应用程序支持等。强大的功能。除封装了大部分的Win32 SDK函数外,MFC还提供了应用程序本身的数据和操作及ActiveX、OLE、Internet、WinSock、DAO(Data Access Objects)、ODBC(Open DataBase Connectivity)等操作类。
MFC框架的核心是文档/视图结构(Document-View Architecture),这是一个很好用的功能。简单的说,文档/视图结构就是将数据和对数据的观察或数据的表现(显示)相分离。文档仅处理数据的实际读、写操作,视图则是显示和处理数据的窗口,视图可以操作文档中的数据。
3. 消息映射
在使用Visual C++进行Win32程序设计时,消息映射是一个非常重要的概念。Windows应用程序是消息驱动的,应用程序不能直接得到用户所做的操作,如鼠标按键、键盘输入和窗口移动等。这些操作由操作系统管理,操作系统检测到操作事件后,便向相关的应用程序发送消息,应用程序响应这些消息来完成用户的操作。
(1)消息
Windows中的消息是操作系统与应用程序之间、应用程序与应用程序之间、应用程序各对象之间相互控制与传递信息的方式。
消息主要有以下3类。
Windows系统消息:Windows系统向窗口发送的消息,由窗口(Window)或视图(View)进行响应处理。这类消息包括除WM_COMMAND消息之外的名称以WM_开始的其他消息。
控制通知消息:控制或子窗口传给父窗口的WM_COMMAND通知的消息。
命令消息:在响应用户接口操作时,将产生WM_COMMAND命令消息。其参数指定了用户接口的标识号,如菜单项和按钮等ID号。
(2)消息映射过程
在使用AppWizard创建应用程序时,MFC应用程序框架设置了相应的消息处理函数来响应消息,以完成相应的操作。消息处理函数是某些类(通常是窗口类)的成员函数和程序员在其中编写响应消息时应进行操作的代码。
框架将消息和它们的处理函数连接起来就是消息映射。消息映射使应用程序在接收到消息时调用对应的消息处理函数来响应和处理消息。
ClassWizard在创建新类时将为其创建一个消息映射,并为每个类能响应的消息和命令增加对应的处理函数。在源代码中,消息映射开始于BEGIN_MESSAGE_MAP宏,结束于END_MESSAGE_MAP宏,中间由一系列预定义的被称为“条目宏”的宏组成。Windows消息的处理函数在CWnd类中进行了预定义,类库以消息名为基础定义这些处理函数的名称,且MFC要求所有消息处理函数声明为afx_msg类型。
通过ClassWizard在派生类中用同样的原型定义处理函数并为该函数生成消息映射条目,然后由程序员编写处理函数代码,并在派生类中覆盖了其父类的消息处理函数。在有些情况下,必须在派生类的消息处理函数中调用其父类的消息处理函数,使Windows和基类能对消息进行处理。ClassWizard将在生成的处理函数中建议是否应调用父类的消息处理函数及调用的次序。除此之外,用户定义和注册的消息、命令和控制通知都没有默认的处理函数,需要在定义时声明,一般根据其ID名称来为函数命名。
第三章、系统设计和实现
在整个面向对象设计期间,我通过需求分析、总体设计、详细设计三个阶段完成了整个设计过程。下面分别介绍这三个阶段的实现过程。
3.1 需求分析性能需求
1、性能需求
(1)硬件平台要求
由于本软件为单机软件,不需进行大量的数据读写和数据交换,故对系统硬件配置的要求并不高,只要能够平稳运行Windows操作系统的硬件平台,都能够使用本软件。提示:软件提供的显示特效,由于其需要相对较为大量的运算,故对CPU性能要求较高,要想获得理想的效果,建议CPU为PIII 800MHz以上。
(2)软件环境要求
本软件运行平台为Microsoft Windows 98/Me/NT/2000/XP/2003。
2、功能需求
本软件要实现的是一款类似于个人管理系统的管家类软件。
本软件有基本信息管理、学习成绩管理、健康信息管理、日程管理、财务管理等五个功能模块。
每个功能模块都可以实现数据以及文本信息的录入、输出以及用表格形式进行反馈,其中的学习成绩管理和健康信息管理还可以通过对录入数据的分析进行一定的评价。
本软件还可以对分析情况进行打印。
另外在工具栏的一些快捷按钮可以帮助用户更好更快的使用本软件,同时在使用过程中还有一定的提示,帮助用户快速了解软件的各项功能。
本软件的帮助功能对本软件进行了比较系统的介绍,并对本软件的诸多好处进行了简要明了的介绍。
3.2 总体设计
在对整个开发系统进行全面分析调查的基础上,制定出应用软件的总体设计规划,这对建立一个应用系统来说是必须的,也是全面展开开发工作的重要基础。系统总体设计包括:模块的划分和软件界面设计。
1. 模块划分
本设计的实现基于微软的MFC应用程序框架,故软件也采用了文档(Document)/视图(View)结构,并使用单文档界面(Single Document Interface,简称SDI)。程序框架在响应它生成的标准用户接口“打开”命令时创建文档/视图结构,由于软件只需提供浏览的供能,因此将生成的标准框架中的“新建”命令禁用,其创建次序如下。
步骤1:程序启动时,WinMain()函数调用应用程序对象的InitInstance()函数,并在其中创建文档模板。
步骤2:程序运行过程中,选择“文件”|“打开”命令,框架将调用CWinApp::OnFileOpen()函数,并使用已创建的文档模板创建文档。
步骤3:文档模板创建主框架窗口。
步骤4:主框架窗口创建文档对应的视图。
程序中文档/视图结构的各对象交互关系如图4.1所示。
图4.1 文档/视图结构对象交互关系
以MVC(Model-View-Controller)应用程序结构划分的模块如图4.2所示。
2. 软件界面设计
根据软件的需求分析及图片浏览软件的特点,本设计中软件采用单文档界面(SDI),包括标准菜单、工具栏和状态栏。工具栏上为常用菜单命令按钮,如“打开”、“保存”、“打印”、“剪贴”、“复制”、“粘贴”、“帮助”等。另外,我们增加了许多便于用户操作的快捷键。
第四章、系统的关键技术及难点
在一个多月的学习与工作中,我们独立自主完成了一个完整的基于MFC的个人信息管理系统的设计。在设计过程中,我遇到了许多的技术问题,下面介绍该系统设计与实现的关键技术和技术难点。
4.1 各对话框的响应连接
在MainFrm.cpp文件中:
#include "BaseInfoImput.h" //声明基本信息录入对话框类的头文件
#include "InfoUpdate.h" //声明基本信息更新对话框类的头文件
#include "BodyInfoCheck.h" //声明健康信息录入对话框类的头文件
#include "BodyInfoImput.h" //声明健康信息更新对话框类的头文件
#include "BodyAnalyse.h" //声明健康信息分析对话框类的头文件
#include "DayHistory.h" //声明日程安排历史查看对话框类的头文件
#include "DayPlan.h" //声明日程安排对话框类的头文件
#include "DayUnfinish.h" //声明日程待完成事件对话框类的头文件
#include "Help.h" //声明帮助对话框类的头文件
#include "MoneyOut.h" //声明财务支出对话框类的头文件
#include "MoneyTotal.h" //声明财务信息统计对话框类的头文件
#include "StudyAnalyse.h" //声明学习成绩分析对话框类的头文件
#include "StudyCheck.h" //声明查看成绩对话框类的头文件
#include "StudyImput.h" //声明成绩录入对话框类的头文件
#include "hangePassword.h" //声明修改密码对话框类的头文件
void CMainFrame::OnBaseImp(){ //弹出基本信息录入对话框按钮的响应函数
BaseInfoImput dia; //建立BaseInfoImput对话框类dia
dia.DoModal(); //创建模态对话框
}
void CMainFrame::OnBaseNew() {
InfoUpdate dia; //类似上函数
dia.DoModal();
}
void CMainFrame::OnBodyAnal() {
BodyAnalyse dia;
dia.DoModal();
}
void CMainFrame::OnBodyCheck() {
BodyInfoCheck dia;
dia.DoModal();
}
void CMainFrame::OnBodyImp() {
BodyInfoImput dia;
dia.DoModal();
}
void CMainFrame::OnDayHis() {
DayHistory dia;
dia.DoModal();
}
void CMainFrame::OnDayPlan() {
DayPlan dia;
dia.DoModal();
}
void CMainFrame::OnDayUn() {
DayUnfinish dia;
dia.DoModal();
}
void CMainFrame::OnHelpUse() {
Help dia;
dia.DoModal();
}
void CMainFrame::OnMonOut() {
MoneyOut dia;
dia.DoModal();
}
void CMainFrame::OnMonTotal() {
MoneyTotal dia;
dia.DoModal();
}
void CMainFrame::OnStuAnal() {
StudyAnalyse dia;
dia.DoModal();
}
void CMainFrame::OnStuCheck() {
StudyCheck dia;
dia.DoModal();
}
void CMainFrame::OnChangePassword() {
ChangePassword dia;
dia.DoModal();
}
4.2 背景图片的插入以及换肤功能的实现
4.2.1. 背景图片插入
在ResourceView选项卡中的Bitmap文件夹中单击右键,选择Insert Bitmap,插入背景图片并设其ID为:IDB_WELCOM。
在informationDoc.h中声明位图类对象:
CBitmap m_welcom; //位图类对象
int m_nWidth; //图宽
int m_nHeight; //图高
在informationDoc.cpp中的构造函数中初始化:
BITMAP BM;
m_welcom.LoadBitmap(IDB_WELCOM); //载入位图IDB_WELCOM
m_welcom.GetBitmap(&BM);
m_nWidth=BM.bmWidth; //获取位图宽
m_nHeight=BM.bmHeight; //获取位图高
在informationView.cpp的OnDraw函数中显示位图:
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(pDoc->m_welcom);
pDC->BitBlt(0,0,pDoc->m_nWidth,pDoc->m_nHeight,&MemDC,0,0,SRCCOPY);
4.2.2. 换肤功能:
在菜单栏中建立换肤菜单,并为每种颜色设置ID,并设置响应函数与information.cpp 中。
void CInformationApp::OnRed() //红色响应函数
{
SetDialogBkColor(RGB(255,0,0),RGB(0,0,0)); //改变颜色函数
}
其余几种颜色类似。
4.3 登陆界面的实现
4.3.1.密码登录
建立登陆对话框,为其建立类CPass。将密码存于数据库中的表PASS中。在information App类中声明一个变量来获取从数据库中调取的密码值(如何调取见4.数据库连接部分):
CString password; //为CString类
在infoemationApp类中的BOOL CInformationApp::InitInstance()中添加:
password=temp1; //把从数据库中获取的密码值赋给password
CPass CDlg; //建立对话框类对象
if(CDlg.DoModal()==IDOK) //如果单击确定按钮
{
if(CDlg.m_Password!=password) //判断输入是否与password相等
{ //如果口令不对,则显示出错信息,然后程序结束
AfxMessageBox("口令错误,确定后将退出程序。");
return FALSE;
}
}
else //如果按下取消按钮,程序也结束
return FALSE;
4.3.2. 修改密码
建立修改密码对话框,并为其建立类ChangePassword,设置各个控件的ID及关联变量,为对话框中的确定按钮添加语句:
void ChangePassword::OnOK() {
CString temp1; //临时变量存储从数据库中读取的旧密码
CRecordset rd1(&db4);
if(! rd1.Open(CRecordset::dynaset,"Select * from PASS")){ //打开数据库表PASS
AfxMessageBox("NO DB!");
}
rd1.GetFieldValue("password",temp1); //把数据表PASS中的就密码赋值给temp1
rd1.Close(); //关闭数据库
UpdateData(TRUE);
if(temp1==m_old && m_new==m_repeat) //判断输入的就密码数否和从数据库中取得的就密码相同,并且两次输入的新密码相同
{
CString temp2="'";
db4.ExecuteSQL("Delete From PASS Where password="+ temp2+ temp1 + temp2);
CString tempSQL="'"+m_new+"'";
tempSQL="INSERT INTO PASS VALUES("+ tempSQL +")";
db4.ExecuteSQL(tempSQL); //把新密码写进数据库覆盖旧密码
}
CDialog::OnOK();
}
4.4 数据库的链接
建立Access数据库,设置个项目表格、数据、数据类型等。在控制面板中的ODBC数据源选项中链接数据库为ODBC类型,命名info。在使用数据库的类中填写代码,我们以基本信息录入类(BaseInfoImput)为例。
在BaseInfoImput.h中添加头文件:
#include <afxdb.h>
添加数据成员:
CDatabase db1;
在BaseInfoImput.cpp中的构造函数中初始化:
if(! db1.Open(_T("info"),FALSE,FALSE,_T("ODBC;"),FALSE)) //打开数据库info
{
AfxMessageBox("No DB!"); //若不成功对话框提示
}
给确定按钮添加响应函数:
void BaseInfoImput::OnOK() {
UpdateData(TRUE); //更新
CString temp1="','";
CString temp2,temp3;
temp2.Format("%d",m_age); //把非CString型数据转换成CString型
if(m_age<0||m_age>100)return; //如果年龄大于100或小于0则返回
if(m_sex==true)temp3="男";
else temp3="女";
CString tempSQL="'"+m_name+temp1+temp3+temp1+temp2+temp1+m_num+"'";
tempSQL="INSERT INTO BASIC VALUES("+ tempSQL +")"; //向BASIC数据表中添加
db1.ExecuteSQL(tempSQL); //向数据库中添加数据
MessageBox("添加成功!"); //添加成功则对话框提示
CDialog::OnOK();
}
下面是更新基本信息对话框的确定按钮的响应函数:
void InfoUpdate::OnOK() {
CString temp1,temp2,temp3,temp4,temp5,temp6;
if(m_newage<=0||m_newage>100)return; //如果年龄大于100或小于0则返回
CRecordset rd1(&db5); //建立Crecordset类的变量
if(! rd1.Open(CRecordset::dynaset,"Select * from BASIC")) //打开数据表BASIC
{
AfxMessageBox("NO DB!"); //打开失败对话框提示
}
rd1.GetFieldValue("姓名",temp1); //获取姓名
rd1.GetFieldValue("性别",temp2); //获取性别
rd1.GetFieldValue("年龄",temp3); //获取年龄
rd1.GetFieldValue("学号",temp4); //获取学号
rd1.Close(); //关闭数据表
UpdateData(TRUE); //更新
CString temp="'";
db5.ExecuteSQL("Delete From BASIC Where 姓名="+ temp+ temp1 + temp);
//删除旧数据
db5.ExecuteSQL("Delete From BASIC Where 性别="+ temp+ temp2 + temp);
db5.ExecuteSQL("Delete From BASIC Where 年龄="+ temp+ temp3 + temp);
db5.ExecuteSQL("Delete From BASIC Where 学号="+ temp+ temp4 + temp);
temp5.Format("%d",m_newage);
if(m_newsex==true)temp6="男";
else temp6="女";
temp="','";
CString tempSQL="'"+m_newname+temp+temp6+temp+temp5+temp+m_newnum+"'";
tempSQL="INSERT INTO BASIC VALUES("+ tempSQL +")";
db5.ExecuteSQL(tempSQL); //添加新数据
CDialog::OnOK();
}
4.5 数据库设计
以下是数据库各种表的设计举例:
第五章、 软件测试与改进思想
在完成了该系统的全部开发工作后,我对该系统进行了测试。下面给出测试的内容与结论,并根据测试的结果给出了软件改进的方案。
5.1 软件测试
在我们完成了软件内容的编写后,我们进行了以下几个方面的软件测试:
<1>五个功能模块对话框链接是否正常
<2>换肤功能是否可以实现
<3>打印功能是否可以实现
<4>数据以及文本录入到数据库是否实现
<5>软件结果输出是否正常
5.2 改进思想
目前需求分析中要求的功能已经基本实现了,并且按照预期的目标生成了一个完整实用的个人信息系统管理软件。但是由于时间有限,本软件也难免会存在不足之处,主要有以下几个方面需要改进:
1、关于学习情况评价没有实现
2、对于属于数据自动生成图表没有实现
3、对于输入的健康情况没能自动给出身体情况评价以及健康建议
4、软件背景音乐添加没有实现
结 束 语
本设计主要用于日常生活管理,是一款比较实用的小软件,该软件可以通过用户不断对自己的信息录入增加对自己日常生活的管理,并且登陆界面的密码管理可以保护用户隐私,可以达到一个软件多人使用的效果。
若是可以实现图标式则可以更为直观的实现用户对于自己个人生活的评价,以达到合理控制自己的时间,更为有效率的制定学习计划。
小组成员:
61008217 成康
61008221 文宸宇
61008224 黄宇鹏
61008228 姜振华
61008229 赵沛
小组分工:
框架设计:黄宇鹏 姜振华
代码主要编写人:文宸宇(其他参与者:成康 赵沛)
开题、中期报告PPT及答辩者:姜振华
课程设计总结及工作日志:黄宇鹏
l ---------------------------------------------------------精品 文档---------------------------------------------------------------------
展开阅读全文