1、最新C+程序设计案例教程习题答案文档串行化编程文档串行化编程将C+对象以字节流的形式保存在二进制文件中称为对象的串行化处理,经过串行化处理的称为持久对象,可以按需要在程序运行中存储和恢复。例4.1 日期对象的串行化SerialData应用程序串行化日期结构数据,用对话框修改数据,用编辑/修改菜单打开对话框。1. 用AppWizard建立一个普通单文档SerialDate工程2. 添加一个对话框资源:3. 用ClassWizard为三个编辑框添加变量m_Year, m_Month, m_Day4. 用ClassWizard添加类CDateDialog(其基类为CDialog)5. 在头文件Ser
2、ialDateDoc.h开头添加下面内容:struct Date int m_Year; int m_Month; int m_Day;#include DateDialog.hclass CSerialDateDoc : public CDocumentprotected: / create from serialization only CSerialDateDoc(); DECLARE_DYNCREATE(CSerialDateDoc)/ Attributespublic:Date date;6. 在“编辑”菜单中添加“修改”子菜单项ID_EDIT_MODIFY: 7. 将“修改”子菜单
3、项ID_EDIT_MODIFY消息映射到OnEditModify:8. 在SerialDateDoc.cpp中添加代码:CSerialDateDoc:CSerialDateDoc() date.m_Year=2002; date.m_Month=6; date.m_Day=1;void CSerialDateDoc:Serialize(CArchive& ar) if (ar.IsStoring() ardate.m_Year date.m_Month date.m_Year date.m_Month date.m_Day ; void CSerialDateDoc:OnEditModify(
4、) CDateDialog dlg; 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代码void CSerialDateView:OnDraw
5、(CDC* pDC) CSerialDateDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CString str; 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)菜单命令
6、打开对话框修改日期:视图中显示的日期会作相应变化。程序退出时提示将修改后的日期数据存盘:选择“是”,将打开文件对话框:下次运行程序时可以通过打开文件恢复“无标题”文件中的日期。例4.2 矩形对象的串行化SerialRect应用程序串行化一个矩形数据,用对话框修改数据,用编辑/修改菜单打开对话框。1. 用AppWizard建立一个普通单文档SerialRect工程,在Step 6将CSerialRectView的基类设为CFormView。AppWizard创建如下初始界面的框架程序:2. 在Form上添加控件,定制界面:3. 添加变量Edit1Edit4整型(m_x1, m_y1, m_x2,
7、 m_y2),取值范围0300,Edit5为Control-CEdit型(m_Ctrl)。4. 用右键选择控件的Events修改Edit1的黙认EN_CHANGE消息处理OnChangeEdit1为自定义的OnChangeEdit。其他三个Edit也映射到这个函数。5. 在头文件SerialRectDoc.h中添加变量:class CSerialRectDoc : public CDocumentprotected: / create from serialization only CSerialRectDoc(); DECLARE_DYNCREATE(CSerialRectDoc)/ Att
8、ributespublic: int x1, y1, x2, y2;/ Operations6. 在SerialRectDoc.cpp的构造函数中初始化变量:CSerialRectDoc:CSerialRectDoc() / TODO: add one-time construction code here x1=y1=x2=y2=0;7. SerialRectView.cpp中添加下面内容:void CSerialRectView:OnChangeEdit() / TODO: Add your control notification handler code hereUpdateData(
9、); 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);void CSerialRectView:OnInitialUpdate() CFormView:OnInitialUpdate(); GetParentFrame()-RecalcLayout(); Re
10、sizeParentToFit(); m_x1=GetDocument()-x1; m_x2=GetDocument()-x2; m_y1=GetDocument()-y1; m_y2=GetDocument()-y2; UpdateData(false);8. 在SerialRectDoc.cpp的串行化代码:void CSerialRectDoc:Serialize(CArchive& ar) if (ar.IsStoring() / TODO: add storing code here arx1y1x2x1y1x2y2; 9. 为CSerialRectView类添加OnDraw函数在工作区类视图中右键单击CSerialRectView类,选择Add Member Function弹出对话框:void CSerialRectView:OnDraw(CDC *pDC) m_Ctrl.UpdateWindow(); pDC=m_Ctrl.GetWindowDC(); pDC-Rectangle(m_x1,m_y1,m_x2,m_y2); UpdateData(false);10. 运行程序,可通过输入坐标值画出矩形,并可将所画的矩形存盘和恢复以前保存的矩形。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1