第15章 c++文档读写与打印.ppt
Visual C+与面向对象程序设计教程与面向对象程序设计教程第十五章第十五章 文档读写与打印文档读写与打印 计算机教学实验中心计算机教学实验中心计算机教学实验中心计算机教学实验中心西安交通大学西安交通大学西安交通大学西安交通大学教学目标教学目标n序列化序列化n文档打印编程技术文档打印编程技术学习要求学习要求n深入理解序列化的基本思想深入理解序列化的基本思想n掌握序列化及相应处理代码的编制掌握序列化及相应处理代码的编制n了解了解MFC的打印工作流程的打印工作流程n掌握打印程序编制掌握打印程序编制授授 课课 内内 容容n15.1 序列化(序列化(Serialize)n15.2 打印和打印预览打印和打印预览 n15.3自定义类的序列化自定义类的序列化n15.4 编写独立的打印处理程序编写独立的打印处理程序 n15.5 更新命令用户接口(更新命令用户接口(UI)消息消息 n调试技术调试技术n程序设计举例程序设计举例15.1 序列化(序列化(Serialize)n文档对象可以将其当前状态(由其成员变量的值文档对象可以将其当前状态(由其成员变量的值表示)写入到永久性存储体(通常是指磁盘)中,表示)写入到永久性存储体(通常是指磁盘)中,以后还可从永久性存储体中读取对象的状态(载以后还可从永久性存储体中读取对象的状态(载入),从而重建对象。入),从而重建对象。n在文档打开时能够自动把文档中的数据转换为文在文档打开时能够自动把文档中的数据转换为文档类所支持的对象,在保存文档时能够自动将文档类所支持的对象,在保存文档时能够自动将文档类对象转换为文档数据格式;档类对象转换为文档数据格式;nCArchiveCArchive类类运算符:插入运算符:插入()()()修改数据的存盘修改数据的存盘n设置修改标志的成员函数设置修改标志的成员函数CDocument:SetModifiedFlag void SetModifiedFlag(BOOL bModified=TRUE);n设置的时机设置的时机l一般在视图类函数中,修改数据后调用例例15-1 序列化序列化 n为例为例11-7的吹泡泡程序增加的吹泡泡程序增加序列化序列化 代码代码if(ar.IsStoring()ar m_nBubbleCount;for(int i=0;im_nBubbleCount;i+)ar m_nBubbleCount;for(int i=0;i m_rectBubblei;注意事项注意事项n 的方向的方向n 变量存盘与取盘的顺序,必须保证一致!变量存盘与取盘的顺序,必须保证一致!n 计数器变量应在数组之前计数器变量应在数组之前15.2 打印和打印预览打印和打印预览 n显示与打印的相同之处显示与打印的相同之处n显示与打印的不同之处显示与打印的不同之处显示与打印的相同之处显示与打印的相同之处n文档打印时,文档打印时,OnDraw函数接收到的设备描述表对函数接收到的设备描述表对象是与当前打印相关的象是与当前打印相关的CDc对象。对象。n实现实现“所见即所得所见即所得”(OnDraw为共用函数)为共用函数)l显示的调用顺序:OnPaint-OnDrawl打印的调用顺序:OnPrint-OnDrawnMM_TEXT模式编程模式编程l打印机与屏幕显示坐标模式相同显示与打印的不同之处显示与打印的不同之处n分辨率不同分辨率不同Arial字体:printer-50 screen-20n边界处理不同边界处理不同l屏幕是无界的l打印纸是有界的例例15-2n修改例修改例11-7的程序并观察其打印结果。的程序并观察其打印结果。void CMyView:OnDraw(CDC*pDC)CRect rect;GetClientRect(&rect);pDC-Rectangle(rect);/画边框画边框for(int i=0;im_nBubbleCount;i+)/在视图上显示文档数据在视图上显示文档数据 pDC-Ellipse(pDoc-m_rectBubblei);例例15-3n改进吹泡泡程序,使之打印输出与屏幕显示的比改进吹泡泡程序,使之打印输出与屏幕显示的比例相近例相近n/设置映射模式设置映射模式void CMyView:OnPrepareDC(CDC*pDC,CPrintInfo*pInfo)pDC-SetMapMode(MM_LOMETRIC);CView:OnPrepareDC(pDC,pInfo);例例15-3n/响应点击鼠标左键消息响应点击鼠标左键消息CClientDC dc(this);/设置设备环境设置设备环境OnPrepareDC(&dc);if(pDoc-m_nBubbleCount m_rectBubblepDoc-m_nBubbleCount=rect;pDoc-m_nBubbleCount+;pDoc-SetModifiedFlag();/设置修改标志设置修改标志 CPrintInfo类类n数据成员数据成员m_nCurPage(当前正在打印的页码);m_rectDraw(当前可用页面区域);n成员函数成员函数SetMinPage()(指定文档的首页页码)SetMaxPage()(指定文档的尾页页码)取关于打印页码的设置UINT GetMinPage()const;UINT GetMaxPage()const;打印和打印预览的主要过程打印和打印预览的主要过程l调用调用OnPreparePrinting函数创建与打印有关的设备函数创建与打印有关的设备描述表对象描述表对象l调用调用OnBeginPrinting函数并基于已创建的设备描述函数并基于已创建的设备描述表对象来设置文档特性,将任何需要的信息保存在表对象来设置文档特性,将任何需要的信息保存在设备描述表对象中例如分配字体、画笔、画刷和设备描述表对象中例如分配字体、画笔、画刷和其他用于打印的对象。其他用于打印的对象。l调用调用OnPrepareDC函数为打印设置文本或绘图员性,函数为打印设置文本或绘图员性,调整视口原点以便打印当前页。调整视口原点以便打印当前页。l调用调用OnPrint函数,该函数在调用函数,该函数在调用OnDraw前先选择前先选择一种字体或其他由一种字体或其他由OnBeginPrinting分配的对象,然分配的对象,然后调用后调用OnDraw函数执行输出。函数执行输出。l调用调用0nEndPrinting删除由删除由onBeginPrinting分配的所有分配的所有对象。对象。(对于每页,(对于每页,3,4两步反复调用)两步反复调用)15.3自定义类的序列化自定义类的序列化n从从CObject类派生出自定义类类派生出自定义类n重载自定义类的重载自定义类的Serialize()()成员函数成员函数n说明中,加入说明中,加入DECLARE_SERIAL()()宏宏n为自定义类定义一个不带参数的构造函数;为自定义类定义一个不带参数的构造函数;n为自定义类重载赋值运算符为自定义类重载赋值运算符“=”;n在自定义类的源代码文件中加入在自定义类的源代码文件中加入IMPLEMENT_SERIAL()()宏。宏。15.4 编写独立的打印处理程序编写独立的打印处理程序 n利用现有模块利用现有模块n打印页眉、正文、页脚;打印页眉、正文、页脚;n选页打印选页打印OnPrint函数函数n打印页眉CDocument:GetTitle()取当前文档名取当前文档名CDC:GetTextExtent()计算字符串在当前映射模式下的宽度和高度计算字符串在当前映射模式下的宽度和高度n打印泡泡数据n打印页脚MM_WIPS模式模式1/1440英寸英寸point.y-=36015.5 更新命令用户接口(更新命令用户接口(UI)消息消息 n菜单选项是否无效的?(灰色显示)菜单选项是否无效的?(灰色显示)1、在窗口类中加入处理更新命令用户接口消息函数、在窗口类中加入处理更新命令用户接口消息函数的说明;的说明;2、在窗口类的消息映射宏中加入更新命令用户接口、在窗口类的消息映射宏中加入更新命令用户接口宏;宏;3、编写更新命令用户接口消息处理函数。、编写更新命令用户接口消息处理函数。n打勾打勾:(m_nGrad为为3,则打勾),则打勾)pCmdUI-SetCheck(m_nGrad=3);n变灰变灰:(m_nGrad为为0,则变灰,则变灰,即即:不为不为0有效)有效)pCmdUI-Enable(m_nGrad!=0);调试技术调试技术 nDeveloper Studio的输出窗口的输出窗口 l激活或取消 l选项Build(建立)Debug(调试)Find In Files 1(在文件1中查找)Find In Files 2(在文件2中查找)Results(结果)。程序设计举例程序设计举例 n例例15-1 实现吹泡泡程序的序列化功能。实现吹泡泡程序的序列化功能。n例例15-2 修改例修改例11-6的程序并观察其打印结果。的程序并观察其打印结果。n例例15-3 改进吹泡泡程序,使之打印输出与屏幕显示的比例相改进吹泡泡程序,使之打印输出与屏幕显示的比例相近。近。n例例15-4 声明一个声明一个Person类,并使之支持序列化。类,并使之支持序列化。n例例15-5 修改例修改例15-3的吹泡泡程序,使其打印每个泡泡的数据的吹泡泡程序,使其打印每个泡泡的数据值。值。n例例15-6 使用定时器使一个泡泡(椭圆)在屏幕中自动移动,使用定时器使一个泡泡(椭圆)在屏幕中自动移动,设置三级速度菜单,并使速度菜单的相应选项前打钩。设置三级速度菜单,并使速度菜单的相应选项前打钩。n例例15-7 七巧板七巧板例例15-7n七巧板是我国民间流传的七巧板是我国民间流传的一种拼图游戏,制作简单一种拼图游戏,制作简单但变化多端,具有很高的但变化多端,具有很高的益智价值。七巧板制作非益智价值。七巧板制作非常简单,使用一张正方形常简单,使用一张正方形的厚纸板按图的厚纸板按图15-6所示图所示图样裁开即可。本程序在计样裁开即可。本程序在计算机上模拟使用七巧板进算机上模拟使用七巧板进行拼图行拼图 上机练习题上机练习题n制制作作简简单单编编辑辑器器:重重载载键键盘盘消消息息,接接收收用用户户字字符符输输入入并并在在客客户区显示。要求可保存输入字符并序列化。户区显示。要求可保存输入字符并序列化。n为例为例13-4增加序列化代码。增加序列化代码。n为例为例13-5增加序列化代码。增加序列化代码。n为为例例14-1编编写写序序列列化化代代码码,并并编编写写打打印印代代码码,使使打打印印格格式式为为每行一职工:每行一职工:姓名姓名 性别性别 出生日期出生日期 婚姻状况婚姻状况 所在部门所在部门 职务职务=张三张三 男男 1972/10/03 未婚未婚 开发部开发部 组长组长 李四李四 男男 1967/06/12 已婚已婚 开发部开发部 副经理副经理 结结束束语语n学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 上机练习。上机练习。n你的编程能力与你在计算机上投入的时间成你的编程能力与你在计算机上投入的时间成 正比。正比。