资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,12,章,综合程序设计,在设计,C+,程序时,可以先基于,DOS,平台快速地设计出构成程序核心代码的各个类,然后再将这些类移植到利用,VC+,向导建立的,应用程序框架,中,用这些类,扩展框架程序的功能,,就能够设计出,Windows,应用程序。,本章将把前面几章建立的,comFinal,、,Account,、,Chemistry,类移植到,Windows,环境中,构造一个,Windows,系统中的学生成绩管理程序,本章的目的是介绍将,DOS,平台的类移植到,Windows,程序中的方法,。,12.1,在应用程序,框架中包含并修改自定义类,1,、,comFinal,程序回顾,从第,4,章到第,7,章,每章最后一节的编程实作都在不断地扩展学生成绩管理程序的功能,并在第,7,章设计出了基于,DOS,平台的应用程序,com_main.dsw,到目前为止,已经设计出了学生档案管理程序中完善的类,comFinal,、,Account,、,Chemistry,。,其中,comFinal,是基类,实现了公共课,English,、,Chinese,、,Math,的管理功能,而,Account,、,Chemistry,类则继承了,comFinal,类的功能,分别用于管理会计学和化学两个专业的课程。类的继承结构如图,12-1,所示。,ComFinal,的继承结构,class,comFinal,char name20;,int,English,Chinese,Math,Total,;,float average;,public:,comFinal(char,*,n,int,Eng,int,Chi,int,Mat);,comFinal,();,comFinal,();,char*,getName,(),int,getEng();int,getChi,(),int,getMat,();,int,getTotal();float,getAverage,(),void show();,;,class,Account:public,comFinal,int,Accoun,;,int,Econ;,int,majTotal,;float,majAve,;,public:,Account();,Account();,int,getMajtotal,()float,getMajave,(),int,getAccount,int,getEcon,(),void show(),class,Chemistry:public,comFinal,int,Chemistr,;,int,Analy,;,int,majTotal,;float,majAve,;,public:,Chemistry();,int,getMajtotal,()float,getMajave,(),int,getChe,(),int,getAnl,(),void,showC,();void show();,;,12.1,在应用程序,框架中包含并修改自定义类,已经完成了的工作,到目前为止,在控制台下已经设计出各个,Class,,为了便于代码重用,将每个类的定义放在一个,.H,头文件中,实现代码放在一个,.,Cpp,文件中各类的源文件名称如下:,comFinl.h,comFinl.cpp,Accout.h,Account.cpp,Chemistry.h,Chemistry.cpp,12.1,在应用程序,框架中包含并修改自定义类,程序移植任务,将基于控制台已经设计完善的这,3,个类:,comFinal,、,Account,、,Chemistry,移植到,Windows,程序中,并为它设计菜单、鼠标点击事件,数据输入对话框,并实现文档序列化功能。,12.1,在应用程序,框架中包含并修改自定义类,【,例,12-1】,用,VC+,向导建立一个应用程序框架,然后将第,7,章建立的,comFinal,、,Account,、,Chemistry,三个类的上述,6,个文件添加到应用程序框架中。,过程如下,移植控制台,的,comfinl,到,1,建立应用程序框架,(,1,)启动,VC+6.0,,选择“文件”菜单的“新建”命令。,(,2,)通过弹出的新建对话框建立一个“,MFC,AppWizard(exe,)”,单文档项目文件,假设将该项目文件保存在目录,C:,dk,中,项目文件名是,comMFC,。,向导将在目录,C:,dk,下生成一个,comMFC,目录,并在其中产生与项目相关的文件,包括项目文件,comMFC.dsw,及与应用程序类、框架窗口类、文档类、视图类相关的以下头文件和源程序文件:,comMFC.h/comMFC.cpp,应用程序类的头文件和源文件,MainFrm.h/MainFrm.cpp,框架窗口类的头文件和源文件,comMFCView.h/comMFCView.cpp,视图类的头文件和源文件,comMFCDoc.h/comMFCDoc.cpp,文档类的头文件和源文件,2,将,自定义类添加到应用程序框架中,(,1,)将第,7,章建立的:,comFinl.h,,,comFinl.cpp,,,Accout.h,,,Account.cpp,,,Chemistry.h,,,Chemistry.cpp,文件,复制,到,comMFC,项目文件的目录,C:,dkcomMFC,中。,(,2,)通过,VC+,的“,工程,”菜单,将这,6,个文件添加到应用程序框架,中。方法是:,选择,VC+,的菜单命令“,工程,|,添加工程,|Files”,,然后在弹出的文件选择对话框中,将,6,个文件全部添加到应用程序框架的工程项目中。,3,修改,自定义类,将在,DOS,程序中设计的,C+,类移植到,Windows,程序中后,以下两个问题需要修改,首先,数据输入,/,输出问题。,DOS,系统采用字符方式输入,/,输出数据,而,Windows,系统采用图形方式输入,/,输出数据,因此那些在,DOS,系统中用于输入或输出数据的类成员函数在,Windows,程序中就不能再用了,可将这类成员函数删除或注释掉。,本例不作修改。,需要在每个类的源程序文件中增加对,stdafx.h,文件的包含,因为,stdafx.h,文件中预定义了,Windows,程序需要用到的一些全局性数据、变量及函数。,3,修改,自定义类,现在来看看在自定义类的源程序中不包含,stdafx.h,头文件会产生的问题。,(,1,)编译,comMFC,,将会见到如下,3,个错误信息:,fatal error C1010:unexpected end of file while looking for precompiled header directive,Chemistry.cpp,这些错误指出在编译,Chemistry.cpp,、,comFinl.cpp,等源文件时,没有找到需要的预编译头文件,stdafx.h,,应该在,comFinl.cpp,、,Account.cpp,和,Chemistry.cpp,中包含,stdafx.h,头文件。,2,)在自定义类的源文件中增加对,stdafx.h,头文件的包含,在,comFinal.cpp,文件中增加,stdafx.h,头文件包含,/*,comFinal.cpp,*/,#include,stdafx.h,/,不包含该头文件将产生编译错误,#include,comFinl.h,在,Chemistry.cpp,文件中增加,stdafx.h,头文件包含,/*,Chemistry.cpp,*/,#include,stdafx.h,/,不包含该头文件将产生编译错误,#include,Chemistry.h,在,account.cpp,文件中增加,stdafx.h,头文件包含,/*,account.cpp,*/,#include,stdafx.h,/,不包含该头文件将产生编译错误,#include,account.h,“,(,3,)编译程序,这次不会有任何错误,运行它将见到,MFC,默认的框架程序界面,12.2,在事件,函数中操作类对象,应用程序框架中的每个类就像一个容器,可以在其中包含其他类的对象,即可用其他类定义它的对象成员。,如在例,12-1,建立的框架程序中,可以在应用程序类,comMFC,、框架窗口类,MainFrm,、视图类,comMFCView,及文档类,comMFCDoc,中,定义,comFinal,、,Account,和,Chemistry,类的对象,,并通过框架类的,事件函数,调用自定义类的成员函数,实现需要的程序功能。,12.2,在事件,函数中操作类对象,【,例,12-2】,扩展例,12-1,的程序功能,,,左键单击奇数次时产生一个会计学类,Account,的对象,,,单击偶数次时产生一个化学类,Chemistry,的对象,,并在鼠标单击位置生成一个椭圆,将产生的学生对象的数据显示在该椭圆中。,程序设计思路:,在视图类,comMFCView,中实现程序功能,。将鼠标单击时生成的,Account,和,Chemistry,对象分别保存在不同数组中,并以鼠标单击位置为中心建立一个矩形,然后产生,WM_PAINT,消息,调用视图类的,OnPaint,成员函数在屏幕上以数组中保存的矩形为边框画内切椭圆,在椭圆中输出所建类对象的数据成员。,12.2,在事件,函数中操作类对象,程序实现方法:,在,comMFCView,类中定义,3,个数组,che,、,acc,、,m_rectBubble,,,che,用于保存,Chemistry,类的对象,,acc,用于保存,Account,类的对象,,m_rectBubble,用于保存建立的矩形。,然后利用,VC+,向导为,comMFCView,添加鼠标左键单击的消息响应函数,OnLButtonDow,n,和,WM_PAINT,消息响应函数,OnPaint,,并在该函数中输出,che,、,acc,、,m_rectBubble,这,3,个数组中的对象。,12.2,在事件,函数中操作,自定义类,对象,实现过程如下:,(,1,)在,comMFCView.h,头文件中包含,Account,和,Chemistry,类的头文件,。,/*,comMFCView.h,*/,#,includeChemistry.h,/,增加,Chemistry,类的头文件包含,#,includeAccount.h,/,增加,Account,类头文件包含,class,CComMFCView,:public,CView,红字为添加的程序代码,(,2,)在,comMFCView,类的声明中定义,Account,和,Chemistry,类的对象数组,che,、,acc,及其他数据成员,增加的代码如下粗体字所示。,class,CComMFCView,:public,CView,protected:,#define MAX_BUBBLE 250/,类对象的最多个数,CRect,m_rectBubble1000;/,保存鼠标位置的矩形,int,m_nBubbleCount,;/,矩形个数的计数器,char*name;/,代表,Account,或,Chemistry,的名字,int,s1,s2,s3,s4,s5;/,代表,5,科目成绩的变量,Chemistry,cheMAX_BUBBLE,;/,保存,Chemistry,对象的数组,Account,accMAX_BUBBLE,;,/,保存,Account,对象的数组,;,红字为添加的程序代码,12.2,在事件,函数中操作,自定义类,对象,(,3,)在,CComMFCView,类的构造函数中初始化矩形计数器,m_nBubbleCount,。,CComMFCView:CComMFCView,(),m_nBubbleCount,=0;,红字为添加的程序代码,(,4,)利用,VC+,的类向导为,CComMFCView,类添加鼠标左键单击事件的消息响应函数,并修改其中代码,void,CComMFCView:OnLButtonDown(UINT,nFlags,CPoint,point),if(m_nBubbleCount,1000),/,下面,3,行语句以鼠标光标位置为中心,,60,为半径建立一个矩形对象,并,/,将它,/,保存在矩形数组,m_rectBubble,中,int,r=60;,CRect,rect(point.x-r,point.y-r,point.x+r,point.y+r,);,m_rectBubblem_nBubbleCount,=,rect,;,/s1s5,分别代表学生的这,5,科成绩,产生,50100,之间的随机数代表成绩,s1=rand()%50+50;,s2=rand()%50+50;,s3=rand()%50+50;,s4=rand()%50+50;,s5=rand()%50+50;,if(m_nBubbleCount,%2),/,偶数次单击鼠标时建立一个,Chemistry,类对象,name=,化学系,;,chem_nBubbleCount,=Chemistry(name,s1,s2,s3,s4,s5);,else,/,奇数次单击鼠标时建立一个,Account,类对象,name=,会计系,;,accm_nBubbleCount,=Account(name,s1,s2,s3,s4,s5);,m_nBubbleCount,+;/,对象计数器增加,InvalidateRect(rect,FALSE);/,产生,WM_PAINT,消息,CView:OnLButtonDown(nFlags,point);,(,5,)通过类向导为,CComMFCView,类添加,OnPaint,消息响应函数,void,CComMFCView:,OnPaint,(),CPaintDC,dc(this,);/,为当前窗口获取设备环境,dc.SelectStockObject(LTGRAY_BRUSH,);/,选入浅灰色画刷,char buffer10;/buffer,数组用于格式化成绩,便于输出,long,x,y,;/,x,y,用于计算在椭圆中输出对象的左上角位置,for(,int,i=0;i,m_nBubbleCount;i,+),x=(m_rectBubblei.left+m_rectBubblei.right)/2-10;,y=(m_rectBubblei.top+m_rectBubblei.bottom)/2-10;,dc.Ellipse(m_rectBubblei,);/,在矩形中画内切椭圆,if(i,%2),dc.SelectStockObject(LTGRAY_BRUSH,);/,选入浅灰色画刷,dc.TextOut(x-12,y-25,chei.getName();/,输出化学对象的名字,sprintf,(buffer,%d%d,%d,0,chei.getEng,(),chei.getMat,(),chei.getChi,();,dc.TextOut(x-18,y,buffer);/,输出英语、数学、汉语,sprintf(buffer,%d%d 0,chei.getAnl(),chei.getChe,();,dc.TextOut(x-8,y+20,buffer);/,输出化学分析和化学成绩,12.2,在事件,函数中操作,自定义类,对象,else,dc.SelectStockObject(DKGRAY_BRUSH,);/,选入深黑色画刷,dc.TextOut(x-12,y-25,acci.getName();/,输出会计学对象名字,sprintf(buffer,%d%d,%d,0,acci.getEng,(),acci.getMat,(),acci.getChi,();,dc.TextOut(x-18,y,buffer);/,输出英语、数学、汉语,sprintf(buffer,%d%d 0,acci.getAccount,(),acci,.,getEcon,();,dc.TextOut(x-8,y+20,buffer);/,输出会计学和经济学成绩,12.3,添加对话框,【,例,12-3】,扩展例,12-2,的程序功能,为它设计一个输入数据的对话框,当右键单击程序窗口时,就弹出该数据输入对话框,通过该对话框输入学生姓名和各科成绩,并在鼠标右击位置画一个椭圆,同时将学生对象的数据显示在该椭圆中。,12.3,添加对话框,程序设计思路和方法:,以右键单击位置为中心产生一个矩形,为简化问题,将该矩形存入前面建立的矩形数组,m_rectBubble,中,然后弹出数据输入对话框,按照与例,12-2,相同的方法建立,Account,或,chemistry,类的对象。,即如果当前的矩形个数是偶数,就用对话框中的输入数据建立,Chemistry,类的对象,并将之保存在,che,数组中;如果当前的矩形个数是奇数,就用对话框中的输入数据建立一个,Account,类的对象,并将之保存在,acc,数组中。,例,12-2,建立的,CComMFCView:OnPaint,成员函数已经实现了输出,m_rectBubble,、,che,和,acc,数组中各对象的功能,本例可不作任何修改,12.3,添加对话框,实现过程如下,(,1,)在,VC+,中打开例,12-2,建立的,comMFC.dsw,项目文件,选择项目工作窗口中的,ResourceView,标签,然后通过“,Dialog”,编辑器插入一个对话框“,IDD_DIALOG1”,,如图,12-4,所示。,(,2,)上图对话框中的学生,成绩登录、姓名、语文、数学、英语、专业课一、专业课二,都是,文本标签,,这些标签,右边,放置的都是,文本编辑框,控件。,将,姓名编辑框,ID,修改为,IDC_NAME,,,语文编辑框,ID,改为,IDC_CHINESE,,,数学编辑框,ID,修改为,IDC_MATH,,,英语编辑框,ID,修改为,IDC_ENGLISH,,,专业课一编辑框的,ID,修改为,IDC_PROSS1,,,专业课二编辑框的,ID,修改为,IDC_PROSS2,。修改对话框原来的默认命令按钮“,OK”,的标题为“确定”,修改“,CANCEL”,按钮的标题为“取消”,3,)建立好图,12-4,所示的成绩登录窗口后,按快捷键,Ctrl+W,启动,MFC,类向导,在弹出的对话框中指定“,Create a new class”,,然后在弹出的“,New class”,设置对话框中指定新类的名字为,STUDLG,。,4,)再次启动,MFC,类向导(按快捷键,Ctrl+W,),选择类向导中的“,Member Variables,”,标签对话框为新建立的对话框类,STUDLG,的控件设置用于数据交换的类成员,如表,12-1,所示。,对话框控件,数据交换成员,数据成员类目,数据类型,IDC_Chinese,m_CHINESE,Values,int,IDC_MATH,m_MATH,Values,int,IDC_ENGLISH,m_ENGLISH,Values,int,IDC_NAME,m_NAME,Alues,Cstring,IDC_PROSS1,m_PROSS1,Values,int,IDC_PROSS2,m_PROSS2,Values,int,d1,12.3,添加对话框,(,5,)在视图类的头文件,CComMFCView.h,中添加对话框类,STUDLG,的头文件包含,如下所示:,/*,comMFCView.h,*/,#include,Chemistry.h,#include,Account.h,#include,studlg.h,/,添加此头文件包含,class,CComMFCView,:public,CView,红字是添加的代码,(,6,)按快捷键,Ctrl+W,启动,VC+,类向导为,CComMFCView,类建立鼠标右键单击事件的消息响应函数,OnLButtonDown,,然后在该函数中添加程序代码,如下所示。,void,CComMFCView:OnRButtonDown(UINT,nFlags,CPoint,point),/,保存在矩形数组中,int,r=60;,CRect,rect(point.x-r,point.y-r,point.x+r+50,point.y+r);,m_rectBubblem_nBubbleCount,=,rect,;,STUDLG,stu,;,/,建立一个对话框对象,if(stu.DoModal,()=IDOK),/,stu.m_NAME,是,Cstring,类型,下面两条语句将它转换成,char*,类型因为,Chemistry,和,Account,构造函数中的,name,是,char*,类型,name=new,char(sizeof(stu.m_NAME,);,strcpy(name,stu.m_NAME,);,if(m_nBubbleCount,%2)/,用对话框中的数据建立,Chemistry,对象,chem_nBubbleCount,=,Chemistry(name,stu.m_CHINESE,stu.m_ENGLISH,stu.m_MATH,stu.m_PROSS1,stu.m_PROSS2);,else /,利用对话框中的数据建立,Account,对象,accm_nBubbleCount,=,Account(name,stu.m_CHINESE,stu.m_ENGLISH,stu.m_MATH,stu.m_PROSS1,stu.m_PROSS2);,m_nBubbleCount,+;,InvalidateRect(rect,FALSE);/,产生,WM_PAINT,消息调用,OnPaint,函数,CView:OnRButtonDown(nFlags,point);,12.4,添加程序菜单,【,例,12-4】,扩展例,12-3,的程序功能,完善其菜单功能。使之能够通过菜单增加一个,Account,或,Chemistry,类的对象,并且能够通过菜单在矩形框中显示对象数据。,实现过程如下:,(,1,)启动,VC+,,打开例,12-3,建立的,comMFC.dsw,项目文件,选择项目工作窗口中的,ResourceView,标签,然后通过“,Menu,”,编辑器修改主菜单“,IDD_MAINFRAME,”,,在其中增加“显示”和“增加学生”两个菜单,如图,12-6,所示。,(,2,)在新增的“,显示,”菜单下面添加一个“,矩形,”菜单项,在“,增加学生,”菜单下面增加“,会计系,”、“,化学系,”、“,用对话框增加,”,3,个菜单项,并按表,12-2,设置各菜单项的,ID,。,菜单项名,菜单,ID,菜单项名,菜单,ID,矩形,ID_RECT,化学系,ID_CHEM,会计系,ID_ACCOUNT,用对话框增加,ID_DIALOG,(,3,)按快捷键,Ctrl+W,启动,VC+,类向导,通过其中的“,Message Maps”,,为视图类,CComMFCView,建立表,12-2,中菜单标识,ID_RECT,、,ID_ACCOUNT,、,ID_CHEM,、,ID_DIALOG,的消息映射。,(,4,)在类向导为,CComMFCView,建立的菜单消息响应函数,OnRect,、,OnChem,、,OnAccount,、,OnDialog,中添加程序代码。,void,CComMFCView,:OnRect,(),CClientDC,dc(this,);/,不同于,OnPaint,的语句,dc.SelectStockObject(LTGRAY_BRUSH,);,char buffer10;,long,x,y,;,for(int,i=0;i,m_nBubbleCount;i,+),x=(m_rectBubblei.left+m_rectBubblei.right)/2-10;,y=(m_rectBubblei.top+m_rectBubblei.bottom)/2-10;,dc.Rectangle(m_rectBubblei,);/,不同于,OnPaint,函数的语句,if(i,%2),dc.SelectStockObject(LTGRAY_BRUSH,);,dc.TextOut(x-12,y-25,chei.getName();,sprintf(buffer,%d,%d,%d,0,chei.getEng(),chei.getMat(),chei.getChi,();,dc.TextOut(x-18,y,buffer);,sprintf(buffer,%d,%d 0,chei.getAnl(),chei.getChe,();,dc.TextOut(x-8,y+20,buffer);,else,dc.SelectStockObject(DKGRAY_BRUSH,);,dc.TextOut(x-12,y-25,acci.getName();,sprintf(buffer,%d,%d,%d,0,acci.getEng(),acci.getMat,(),acci.getChi,();,dc.TextOut(x-18,y,buffer);,sprintf(buffer,%d,%d 0,acci.getAccount(),acci,.,getEcon,();,dc.TextOut(x-8,y+20,buffer);,void,CComMFCView:,OnChem,(),CRect,rect(10,100,200,200);,m_rectBubblem_nBubbleCount,=,rect,;,name=,化学系,;,chem_nBubbleCount,=Chemistry(name,85,85,85,84,85);,m_nBubbleCount,+;,InvalidateRect(rect,FALSE);,void,CComMFCView:,OnAccount,(),CRect,rect(100,200,200,300);,m_rectBubblem_nBubbleCount,=,rect,;,name=,会计系,;,accm_nBubbleCount,=Account(name,85,85,85,84,85);,m_nBubbleCount,+;,InvalidateRect(rect,FALSE);,void,CComMFCView:OnDialog,(),int,x=rand()%200+50;,int,y=rand()%200+50;,int,r=60;,CRect,rect(x-r,y-r,x+r+50,y+r);,m_rectBubblem_nBubbleCount,=,rect,;,STUDLG,stu,;,if(stu.DoModal,()=IDOK),name=new,char(sizeof(stu.m_NAME,);,strcpy(name,stu.m_NAME,);,if(m_nBubbleCount,%2),chem_nBubbleCount,=,Chemistry(name,stu.m_CHINESE,stu.m_ENGLISH,stu.m_MATH,stu.m_PROSS1,stu.m_PROSS2);,else,accm_nBubbleCount,=,Account(name,stu.m_CHINESE,stu.m_ENGLISH,stu.m_MATH,stu.m_PROSS1,stu.m_PROSS2);,m_nBubbleCount,+;,InvalidateRect(rect,FALSE,);,12.5,文档序列化,【,例,12-5】,完善例,12-4,的程序功能,实现文档序列化功能。,程序设计思路及实现方法:,在文档类,CComMFCDoc,中定义一个保存程序建立的,Account,或,Chemistry,类对象的链表,并且由文档类实现该链表对象的磁盘存取操作;,视图类,CComMFCView,保持原有的功能,左键单击奇数次时建立,Account,类的对象,单击偶数次时建立一个,Chemistry,的对象,并将对象保存在文档类建立的对象链表中;单击右键时,弹出输入学生档案的对话框,且利用对话框中输入的数据建立一个,Account,或,Chemistry,类的对象,并将建立的对象保存在文档类建立的对象链表中;,通过菜单项建立的对象也保存在文档类建立的对象链表中;最后用,OnDraw,函数将文档类链表中的对象显示在屏幕上。上述程序设计思路可用如图,12-10,表示,,12.5,文档序列化,实现过程:,自定义类,comFinal,、,Chemistry,和,Account,,要实现文档序列化,需要让它们继承,CObject,类的文档序列化功能,并添加文档序列化的宏和文档序列化函数,Serialize,。,由于,comFinal,是,Chemistry,和,Account,的基类,只要它继承了,CObject,类的功能,,Chemistry,和,Account,类就能够从它处继承到这些功能。,1,)实现,comFinl,类的序列化 在类的头文件,comFinal.h,中进行如下修改:,/*,comFinal.h,*/,class,comFinal:public,CObject,/friend,ostream,&operator(,ostream,&,os,comFinal,/L1,/friend void,show(comFinal,&,st,);,protected:,/char name20;,CString,name;,public:,comFinal(CString,n,int,Eng,int,Chi,int,Mat);,CString,getName,/()return name;,/virtual void show();,public:,/,添加的函数,virtual,int,getEcon()return,0;virtual,int,getAccount()return,0;virtual,int,getAnl()return,0;,virtual,int,getChe()return,0;,virtual void,Serialize(CArchive,&,ar,);,DECLARE_SERIAL(comFinal,),;,红字是对原来代码的修改,需要对源文件,comFinal.cpp,进行以下修改:,/*,comFinal.cpp,*/,#include,stdafx.h,#include,#include,#include,comFinl.h,IMPLEMENT_SERIAL(comFinal,CObject,1),/,实现文档序列化宏,/,修改,name,类型为,CString,comFinal:comFinal(,CString,n,int,Eng,int,Chi,int,Mat),English=,Eng;Chinese,=,Chi;Math,=Mat;,Total=,English+Chinese+Math,;,average=(,float)(English+Chinese+Math,)/3);,/,strcpy(name,n,);/,原来的,name,赋值句,name=n;,/,CString,类型可直接赋值,void,comFinal:Serialize(CArchive,&,ar,)/,文档序列化函数,if(ar.IsStoring,(),ar,nameChineseEnglishnameChineseEnglishMath;/,从磁盘文件读数据到数据成员,红字是对原来代码的修改,(,2,)实现,Chemistry,类的序列化,对,Chemistry.h,文件的修改如下:,/*,Chemistry.h,*/,#include,comFinl.h,#,ifndef,chemistry_h,#define,chemistry_h,class,Chemistry:public,comFinal,/friend,ostream,&operator(,ostream,&,os,Chemistry,public:,/void show();,Chemistry(,CString,n,int,Eng,int,Chi,int,Mat,int,Chem,int,Anal);,/,增加下面两行代码,virtual void,Serialize(CArchive,&,ar,);,DECLARE_SERIAL(Chemistry,),;,#,endif,对,Chemistry.cpp,文件进行修改,最后的程序代码如下:,/*,Chemistry.cpp,*/,#include,stdafx.h,#include,#include,Chemistry.h,IMPLEMENT_SERIAL(Chemistry,comFinal,1),Chemistry:Chemistry(,CString,n,int,Eng,int,Chi,int,Mat,int,Chem,int,Anal):comFinal(n,Eng,Chi,Mat,),Chemistr,=,Chem;Analy,=Anal;,void,Chemistry:Serialize(CArchive,&,ar,)/,新增加的文档序列化函数,comFinal:Serialize(ar,);,if(ar.IsStoring,(),ar,Chemistr,Chemistr,Analy,;,(,3,),Account,类的序列化,Account,类的序列化与,Chemistry,类的序列化完全相同,参考第,404,页,(,4,)实现,文档类,CComMFCDoc,的序列化,对,comMFCDoc.h,的修改如下:,/*,comMFCDoc.h,*/,class,CComMFCDoc,:public,CDocument,public:,CObList,comList,;,/,对,comMFCDoc.h,类的唯一修改,;,(,4,)实现,文档类,CComMFCDoc,的序列化,在,comMFCDoc.cpp,文件中需对文档序列化函数,Serialize,进行修改,修改后的内容如下:,void,CComMFCDoc:S,erialize(CA,rchive,&,ar,),if(,ar.IsStoring,(),/TODO:add storing code here,else,/TODO:add loading code here,comList.Serialize(ar,);/,对,Serialize,唯一的修改,(,5,)视图类,CComMFCView,的文档序列化,对,CComMFCView.h,的修改如下:,/*,CComMFCView.h,*/,class,CComMFCView,:public,CView,protected:,/,删除了,acc,、,che,、,m_rectBubble,数组的定义,/,下面是,CComMFCView,类中的全部自定义对象及变量,comFinal,*com;/,增加的对象指针定义,#define MAX_BUBBLE 250,int,m_nBubbleCount,;,char*name;,int,s1,s2,s3,s4,s5;,/,AFX_MSG(CComMFCView,),/,afx_msg,void,OnPaint,();/,注释掉原来的,OnPaint,成员函数,/AFX_MSG,;,对,comMFCView.cpp,源文件的修改,注释或删除,CComMFCView:OnPaint,(),成员函数。,修改左键单击事件成员函数,改后的程序代码见,第,406,页,修改鼠标右键单击事件函数,,改后的程序代码见,第,406,页,修改“增加学生”菜单中的“化学系”和“会计系”菜单
展开阅读全文