最新《C++程序设计案例教程》习题答案文档串行化编程.docx
《最新《C++程序设计案例教程》习题答案文档串行化编程.docx》由会员分享,可在线阅读,更多相关《最新《C++程序设计案例教程》习题答案文档串行化编程.docx(12页珍藏版)》请在冰豆网上搜索。
![最新《C++程序设计案例教程》习题答案文档串行化编程.docx](https://file1.bdocx.com/fileroot1/2022-11/16/2a6c404e-5642-45f1-b437-3c45587c2b50/2a6c404e-5642-45f1-b437-3c45587c2b501.gif)
最新《C++程序设计案例教程》习题答案文档串行化编程
文档串行化编程
将C++对象以字节流的形式保存在二进制文件中称为对象的串行化处理,经过串行化处理的称为持久对象,可以按需要在程序运行中存储和恢复。
例4.1日期对象的串行化
SerialData应用程序串行化日期结构数据,用对话框修改数据,用编辑/修改菜单打开对话框。
1.用AppWizard建立一个普通单文档SerialDate工程
2.添加一个对话框资源:
3.用ClassWizard为三个编辑框添加变量m_Year,m_Month,m_Day
4.用ClassWizard添加类CDateDialog(其基类为CDialog)
5.在头文件SerialDateDoc.h开头添加下面内容:
structDate
{
intm_Year;
intm_Month;
intm_Day;
};
#include"DateDialog.h"
classCSerialDateDoc:
publicCDocument
{
protected:
//createfromserializationonly
CSerialDateDoc();
DECLARE_DYNCREATE(CSerialDateDoc)
//Attributes
public:
Datedate;
…
}
6.在“编辑”菜单中添加“修改”子菜单项ID_EDIT_MODIFY:
7.将“修改”子菜单项ID_EDIT_MODIFY消息映射到OnEditModify:
8.在SerialDateDoc.cpp中添加代码:
CSerialDateDoc:
:
CSerialDateDoc()
{
date.m_Year=2002;
date.m_Month=6;
date.m_Day=1;
}
voidCSerialDateDoc:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
ar<}
else
{
ar>>date.m_Year>>date.m_Month>>date.m_Day;
}
}
voidCSerialDateDoc:
:
OnEditModify()
{
CDateDialogdlg;
dlg.m_Year=date.m_Year;
dlg.m_Month=date.m_Month;
dlg.m_Day=date.m_Day;
if(dlg.DoModal()==IDOK)
{
date.m_Year=dlg.m_Year;
date.m_Month=dlg.m_Month;
date.m_Day=dlg.m_Day;
}
UpdateAllViews(NULL);
SetModifiedFlag(true);//关闭窗口时提示存盘
}
9.修改SerialDateView.cpp中的OnDraw代码
voidCSerialDateView:
:
OnDraw(CDC*pDC)
{
CSerialDateDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CStringstr;
str.Format("Year:
%d",pDoc->date.m_Year);
pDC->TextOut(20,20,str);
str.Format("Month:
%d",pDoc->date.m_Month);
pDC->TextOut(20,40,str);
str.Format("Day:
%d",pDoc->date.m_Day);
pDC->TextOut(20,60,str);
}
10.编译运行程序
初始界面:
用编辑(E)>修改(M)菜单命令打开对话框修改日期:
视图中显示的日期会作相应变化。
程序退出时提示将修改后的日期数据存盘:
选择“是”,将打开文件对话框:
下次运行程序时可以通过打开文件恢复“无标题”文件中的日期。
例4.2矩形对象的串行化
SerialRect应用程序串行化一个矩形数据,用对话框修改数据,用编辑/修改菜单打开对话框。
1.用AppWizard建立一个普通单文档SerialRect工程,在Step6将CSerialRectView的基类设为CFormView。
AppWizard创建如下初始界面的框架程序:
2.在Form上添加控件,定制界面:
3.添加变量Edit1~Edit4整型(m_x1,m_y1,m_x2,m_y2),取值范围0~300,Edit5为Control-CEdit型(m_Ctrl)。
4.用右键选择控件的Events修改Edit1的黙认EN_CHANGE消息处理OnChangeEdit1为自定义的OnChangeEdit。
其他三个Edit也映射到这个函数。
5.在头文件SerialRectDoc.h中添加变量:
classCSerialRectDoc:
publicCDocument
{
protected:
//createfromserializationonly
CSerialRectDoc();
DECLARE_DYNCREATE(CSerialRectDoc)
//Attributes
public:
intx1,y1,x2,y2;
//Operations
…
6.在SerialRectDoc.cpp的构造函数中初始化变量:
CSerialRectDoc:
:
CSerialRectDoc()
{
//TODO:
addone-timeconstructioncodehere
x1=y1=x2=y2=0;
}
7.SerialRectView.cpp中添加下面内容:
voidCSerialRectView:
:
OnChangeEdit()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
CSerialRectDoc*pDoc=GetDocument();
if(m_x1!
=pDoc->x1)pDoc->x1=m_x1;
if(m_y1!
=pDoc->y1)pDoc->y1=m_y1;
if(m_x2!
=pDoc->x2)pDoc->x2=m_x2;
if(m_y2!
=pDoc->y2)pDoc->y2=m_y2;
Invalidate(true);
}
voidCSerialRectView:
:
OnInitialUpdate()
{
CFormView:
:
OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_x1=GetDocument()->x1;
m_x2=GetDocument()->x2;
m_y1=GetDocument()->y1;
m_y2=GetDocument()->y2;
UpdateData(false);
}
8.在SerialRectDoc.cpp的串行化代码:
voidCSerialRectDoc:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
//TODO:
addstoringcodehere
ar<}
else
{
//TODO:
addloadingcodehere
ar>>x1>>y1>>x2>>y2;
}
}
9.为CSerialRectView类添加OnDraw函数
在工作区类视图中右键单击CSerialRectView类,选择AddMemberFunction弹出对话框:
voidCSerialRectView:
:
OnDraw(CDC*pDC)
{
m_Ctrl.UpdateWindow();
pDC=m_Ctrl.GetWindowDC();
pDC->Rectangle(m_x1,m_y1,m_x2,m_y2);
UpdateData(false);
}
10.运行程序,可通过输入坐标值画出矩形,并可将所画的矩形存盘和恢复以前保存的矩形。