面向对象的程序设计chapter10ppt课件.ppt_第1页
面向对象的程序设计chapter10ppt课件.ppt_第2页
面向对象的程序设计chapter10ppt课件.ppt_第3页
面向对象的程序设计chapter10ppt课件.ppt_第4页
面向对象的程序设计chapter10ppt课件.ppt_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第10章MFC编程 2 主要内容 MFC体系结构用MFCAppwizard自动生成Windows程序文档 视图结构MFCWindows应用程序典型执行过程设计举例 GO 3 10 1MFC体系结构 基本概念MFC封装了Win32API 目前已包括有200多个类 MFC是一个类层次体系 基类是CObject 其他类大部分是采用单重继承从该类直接或间接派生而来 4 10 1MFC体系结构 常用的以CObject为基类的类层次结构如图10 1所示 5 图10 1 6 10 1MFC体系结构 部分CObject派生类的功能 见表10 1 CCmdTarget封装了MFC的消息映射机制 是MFC类库中消息映射体系的基类 希望接收系统事件和窗口消息的类都从它派生 CWinThread该类的一个对象代表应用程序的一个执行线程 主线程通常由CWinThread的派生类CWinApp的对象提供 7 10 1MFC体系结构 部分CObject派生类的功能 见表10 1 CWinApp派生Windows应用程序对象的基类 CWnd对创建 操纵窗口类的API函数进行了封装 提供了MFC中所有窗口类的基本功能 CFrameWndSDI应用程序的主框架窗口的基类 也是所有其他框架窗口类的基类 8 10 1MFC体系结构 部分CObject派生类的功能 见表10 1 CDocument应用程序文档的基类 CView应用程序文档的基类 CDialog所有对话框 模态或者非模态 的基类 9 10 1MFC体系结构 部分CObject派生类的功能 见表10 1 CFile提供二进制磁盘文件的访问接口 CDC设备上下文类的基类 封装了绘图的所有功能函数 CException所有异常的基类 用于处理各种异常 10 10 2用MFCAppwizard自动生成Windows程序 10 2 1应用程序框架10 2 2MFC消息映射10 2 3使用ClassWizard工具 11 10 2 1应用程序框架 基本概念应用程序框架通常是指一个完整的程序模型 具备标准应用软件所需的一切基本功能 如档案存取 打印预览等 以及这些功能的使用接口 如工具栏 状态栏 菜单等 提供一个一般应用程序所需要的全部面向对象软件组件的集合 12 10 2 1应用程序框架 基本概念MFC应用程序框架分类单文档界面应用程序 简称SDI 多文档界面应用程序 简称MDI 基于对话框的应用程序 13 10 2 1应用程序框架 基于文档 视图结构的应用程序框架 例10 1 实现如图10 2所示的文档 视图结构应用程序的用户界面 图10 2 14 10 2 1应用程序框架 选择菜单项 弹出New对话框 15 10 2 1应用程序框架 MFCAppWizard Step1向导对话框 16 10 2 1应用程序框架 MFCAppWizard Step2of6对话框 17 10 2 1应用程序框架 MFCAppWizard Step3of6对话框 18 10 2 1应用程序框架 MFCAppWizard Step4of6对话框 19 10 2 1应用程序框架 单击Advanced 按钮 则弹出AdvancedOptions对话框 20 10 2 1应用程序框架 21 10 2 1应用程序框架 MFCAppWizard Step5of6对话框 22 10 2 1应用程序框架 MFCAppWizard Step6of6对话框 23 10 2 1应用程序框架 NewProjectInformation对话框 24 10 2 1应用程序框架 选择Build ExecuteS1 exe菜单项或者按Ctrl F5键 运行程序 可得到图示运行结果 25 10 2 1应用程序框架 工作区组成 26 10 2 1应用程序框架 系统默认工程名的修改方法操作步骤 在工作区中选择 ResourceView 标签 展开各资源项 打开 StringTable 文件夹 双击包含的 StringTable 项 在客户区会看到表中的内容 在ID为 IDR MAINFRAME 上双击 将打开 StringProperties 对话框 在Caption编辑框中修改第一个 n 前的字符串为要设置的应用程序标题 27 10 2 1应用程序框架 SDI应用程序的组成一个典型的SDI应用程序一般由四个类组成 主框架窗口类 CMainFrame 由AppWizard自动添加 基类是CFrameWnd 框架类负责管理程序的主窗口 包含窗口边框 标题栏 菜单栏 系统菜单栏 工具栏 状态栏等各种元素 类的定义和实现文件分别是MainFrm h和MainFrm cpp 28 10 2 1应用程序框架 SDI应用程序的组成应用程序类 CS1App 基类是CWinApp 应用程序类是应用程序运行的基础 用来管理整个应用程序 封装了Windows应用程序要做的初始化 运行和终止三大主要任务 该类的定义和实现文件分别是S1 h和S1 cpp 29 10 2 1应用程序框架 SDI应用程序的组成文档类 CS1Doc 基类是CDocument 文档类封装了应用程序的数据管理功能 负责存放程序数据 读出数据并进行I O操作 该类的定义和实现文件分别是S1Doc h和S1Doc cpp 30 10 2 1应用程序框架 SDI应用程序的组成视图类 CS1View 基类是CView 视图类负责管理视图窗口 显示程序中的数据和处理用户输入 而数据是从文档类中获得 视图窗口是框架窗口的子窗口 显示在主框架窗口的客户区中 该类的定义和实现文件分别是S1View h和S1Viw cpp 31 10 2 1应用程序框架 说明在MDI应用程序中 除了具有SDI应用程序中的四个类外 还包括子框架窗口类 此时主框架窗口类的基类为CMDIFrameWnd类 子框架窗口 文档框架窗口 类的基类为CMDIChildWnd类 32 10 2 1应用程序框架 基于对话框结构的应用程序框架 例10 2 实现如图10 14所示的用户界面 图10 14 33 10 2 1应用程序框架 操作步骤 选择菜单项 弹出New对话框 34 10 2 1应用程序框架 MFCAppWizard Step1向导对话框 35 10 2 1应用程序框架 MFCAppWizard Step2of4对话框 36 10 2 1应用程序框架 MFCAppWizard Step3of4对话框 37 10 2 1应用程序框架 MFCAppWizard Step4of4对话框 38 10 2 1应用程序框架 弹出NewProjectInformation对话框 39 10 2 1应用程序框架 说明该应用程序的标题默认为工程名S2 用户可以更改标题 在工作区中单击 ResourceView 标签 展开 Dialog 结点 双击打开 IDD S2 DIALOG 资源 并在其上单击鼠标右键 在快捷菜单中单击 Properties 菜单项 打开对话框属性对话框 在General标签中修改Caption的值 40 10 2 1应用程序框架 工程的文件组成文件夹Debug 用于存放编译 链接时产生的中间文件和可执行文件 Res 用于存放工程的资源文件 工程文件 以E Sample S1为例 S1 dsw 工作区文件 保存了工程所属的工作区信息 S1 dsp 工程文件 保存了用户所建工程的有关信息 41 10 2 1应用程序框架 工程的文件组成工程文件 以E Sample S1为例 S1 opt 工作区选项文件 保存了用户为所建工作区所定制的一些选项 当每次打开该工作区时可自动设置用户定制的选项状态 S1 clw 为ClassWizard数据库文件 存放由ClassWizard使用的信息 Wizard还使用这个文件来存储信息 以便创建和编辑消息映射 对话框数据映射 以及创建成员函数的原型 S1 ncb 非编译的浏览文件 包含了由分析器产生的一些信息 可被ClassView WizardBar和ComponentGallery利用 42 10 2 1应用程序框架 工程的文件组成预编译头文件StdAfx h和StdAfx cpp 这两个文件用来产生预编译头文件S1 pch和一个OBJ文件StdAfx obj 43 10 2 1应用程序框架 工程的文件组成资源文件S1 rc和Resource h 包含了一般MFC应用程序用到的所有资源 如菜单 加速键 字符串表以及About对话框 图标文件 位图文件 res S1 rc2 包含VisualC 不能直接编辑的资源 可以将所有不能由资源编辑器编辑的资源放置到这个文件中 res S1 ico 图标文件 res Toolbar bmp 用于创建工具栏按钮的位图文件 res S1Doc ico 文件类型的图标文件 44 10 2 1应用程序框架 工程的文件组成帮助文件若用户在MFCAppWizard Step4of6对话框中选择了 提供上下文相关帮助 则会在工程目录上生成一个hlp子目录 并产生一系列所需帮助文件 45 10 2 2MFC消息映射 应用程序模式过程控制模式在MS DOS的控制台应用程序中 main函数是程序的入口 按照程序语句的执行流程来控制程序代码的执行 执行的顺序和方式是在编写程序时设置好的 这种程序模式称为过程控制模式 事件驱动模式Windows程序的控制流程不再由事件的预定发生顺序来决定 而是由实际运行时各种事件的实际发生来触发 46 10 2 2MFC消息映射 Windows消息机制Windows消息分类标准Windows消息 以WM 为前缀的消息 除WM COMMAND 命令消息 当用户选择菜单 工具栏 加速键时产生的消息 也以WM COMMAND为消息名 在消息中包含有命令的标识符 ID 以区分具体的命令 控件通知消息 以WM COMMAND为消息名 由编辑框 列表框等控件或子窗口发给其父窗口的通知消息 47 10 2 2MFC消息映射 Windows消息机制MSG结构体 typedefstructtagMSG HWNDhwnd 接收消息的窗口句柄UINTmessage 消息类型WPARAMwParam LPARAMlParam 消息的附加信息DWORDtime 消息发送时间POINTpt 消息发送时光标在屏幕上的位置 MSG 48 10 2 2MFC消息映射 Windows消息机制消息队列系统消息队列应用程序 消息 队列 窗口过程每个窗口会有一个称为窗口过程 WndProc 的回调函数 它带有四个参数 窗口句柄 消息ID 和两个消息参数 wParam lParam 当窗口收到消息时系统就会调用此窗口过程来处理消息 即消息响应 任何一个窗口类都有一个窗口过程 同一个类的窗口使用同样的窗口过程来响应消息 49 10 2 2MFC消息映射 Windows消息机制Windows消息从产生到响应处理的过程 50 10 2 2MFC消息映射 Windows消息机制Windows消息从产生到响应处理的过程消息循环过程代码如下 while GetMessage 51 10 2 2MFC消息映射 MFC消息映射机制基本概念MFC把所有图形用户界面元素 如对话框 按钮 编辑框和菜单等 以类的方式封装 使用消息映射宏将这些图形用户界面元素所发出的消息 映射 到消息处理函数进行处理 消息处理函数是以CCmdTarget为基类的派生类成员函数 CCmdTarget类是MFC处理命令消息的基础和核心 52 10 2 2MFC消息映射 MFC消息映射机制在VC 中建立消息映射必须遵循的规范声明消息处理函数首先 在需要进行消息处理的类定义头文件中 在成员定义末尾加入DECLARE MESSAGE MAP宏 其语法格式如下 DECLARE MESSAGE MAP 其次 在需要进行消息处理的类的定义中声明消息处理函数 其语法格式如下 AFX MSG 子类名 afx msg类型函数名 形参表 AFX MSG 53 10 2 2MFC消息映射 MFC消息映射机制在VC 中建立消息映射必须遵循的规范建立消息与处理函数之间的映射在需要进行消息处理的类的实现文件中加入如下代码 BEGIN MESSAGE MAP 子类名 父类名 消息映射宏定义或消息映射语句 一般有若干个ON COMMAND 消息名或控制号 处理函数名 ON WM END MESSAGE MAP 54 10 2 2MFC消息映射 MFC消息映射机制在VC 中建立消息映射必须遵循的规范添加消息处理函数在需要进行消息处理的类的实现文件中添加消息处理函数 其语法格式如下 类型类名 处理函数名 形参表 处理代码 55 10 2 2MFC消息映射 说明 消息映射的这三项内容既可手工加入 也可以使用ClassWizard工具 ClassWizard为消息处理程序自动生成函数原型和空的函数定义 用户需要根据实际功能添加具体的消息处理函数体代码 56 10 2 2MFC消息映射 MFC命令消息的传递机制基本概念命令消息在应用程序类 文档类 视图类 以及框架窗口类中都可以进行处理 当产生一个命令消息时 该消息的接收和处理对象是有不同的优先级的 消息是按一定的路径进行传递的 57 10 2 2MFC消息映射 MFC命令消息的传递机制 例10 3 为例10 1完成的S1工程添加菜单项 测试 并分别在视图类 文档类 框架类和应用程序类中为其添加消息映射 然后测试消息对视图对象 文档对象 框架对象和应用程序对象的响应优先级 操作步骤略 命令消息的处理过程 58 59 10 2 2MFC消息映射 MFC命令消息的传递机制用户消息 鼠标 键盘输入等 会先发往主框架窗口对象 对于MDI应用程序 会再将消息的处理机会传递给当前活动的MDI子框架窗口 主 子框架窗口对象则将消息传递给当前活动视图对象 视图对象先搜索自己的消息映射 如果没有找到该消息的处理函数 则将消息传递给与此视图关联的文档对象 如果文档对象也没有处理该消息则又将消息传递给文档模板对象 60 10 2 2MFC消息映射 MFC命令消息的传递机制如果在文档模板对象中也没有找到该消息的处理函数 则消息又被传回主 子框架窗口对象 主 子框架窗口对象搜索自己的消息映射 对于MDI应用程序 如果子框架窗口中没有处理函数 命令消息就被传回给主框架窗口 如果找到就进行处理 如果在主框架窗口对象没有处理该消息 则由应用程序对象来处理未被处理的命令消息 61 10 2 3使用ClassWizard工具 打开ClassWizard工具当打开一个工作区文件后 选择View ClassWizard菜单项 可打开MFCClassWizard窗口 主要功能使用ClassWizard进行消息映射使用ClassWizard添加类使用ClassWizard添加成员变量覆盖基类虚成员函数 62 10 2 3使用ClassWizard工具 使用ClassWizard进行消息映射ClassWizard对话框的MessageMaps页面的功能 63 10 2 3使用ClassWizard工具 使用ClassWizard进行消息映射 例10 4 在例10 1完成的S1工程的 查看 菜单下添加菜单项 Hello 并使用ClassWizard工具添加对该菜单项的消息响应 要求该菜单项的消息响应只是弹出一个 Hello 消息框 具体操作步骤略 64 10 2 3使用ClassWizard工具 65 10 2 3使用ClassWizard工具 66 67 68 voidCS1View OnMenuHello TODO AddyourcommandhandlercodehereMessageBox Hello 69 70 10 2 3使用ClassWizard工具 说明 需要删除某个消息映射函数 需要首先用ClassWizard工具删除消息映射入口项和消息处理成员函数的函数原型 然后在该消息映射函数所在的实现文件 cpp 中手动删除该消息处理成员函数的定义代码 71 10 2 3使用ClassWizard工具 使用ClassWizard添加类在打开MFCClassWizard对话框的过程中 如果系统检测到有新建的对话框资源 菜单资源 并且这些资源没有与相应的类关联 就会弹出 AddingaClass 对话框 询问是否创建新类 例10 5 在例10 1完成的S1工程中 添加如图10 31所示的登录对话框 并使用ClassWizard为该登录对话框资源添加类 具体操作步骤略 72 10 2 3使用ClassWizard工具 插入对话框资源 73 10 2 3使用ClassWizard工具 74 10 2 3使用ClassWizard工具 修改对话框ID和标题 75 10 2 3使用ClassWizard工具 添加控件 76 10 2 3使用ClassWizard工具 设置控件属性 77 10 2 3使用ClassWizard工具 鼠标在该对话框资源任意处双击 或打开MFCClassWizard对话框时 会弹出 AddingaClass 对话框 78 79 10 2 3使用ClassWizard工具 使用ClassWizard添加成员变量利用ClassWizard 可以方便地向类中添加成员变量 并将这些成员变量与对话框或窗口中的控件关联起来 当控件的值改变时 所对应的成员变量的值也跟着发生变化 例10 6 向例10 5中的CLoginDialog类中添加成员变量 使它们与相应的控件相关联 具体操作步骤略 80 81 82 10 2 3使用ClassWizard工具 例10 7 测试例10 5和例10 6完成的登录对话框 要求在主界面显示之前弹出一个登录对话框 由用户输入用户名和密码 如果输入正确 则程序继续执行 否则程序终止 具体操作步骤略 83 84 在CS1App InitInstance 函数中添加代码 CLoginDialogm Dlg 声明CLoginDialog类的一个对象if m Dlg DoModal IDOK 用户按了 确定 按钮 用户名为 333 密码为 666 if m Dlg m Username 333 m Dlg m Password 666 如果输入不正确则显示出错信息 然后程序结束MessageBox NULL 输入有误 确定后将退出程序 错误 MB OK MB ICONERROR returnFALSE else 如果按下 取消 按钮 程序结束returnFALSE 85 注意 在文件S1 cpp的头部添加下面的包含语句 include LoginDialog h 86 10 2 3使用ClassWizard工具 覆盖基类虚成员函数在MFC类库中 很多成员函数在声明时都有virtual关键字 即它们都是虚成员函数 当创建基于MFC的应用程序时 在用户的派生类中往往需要重新定义基类的虚成员函数 这样当通过基类对象指针 或引用 调用虚成员函数时 可以实现运行时的多态性 87 10 2 3使用ClassWizard工具 例10 8 在例10 1完成的S1工程的文档类CS1Doc中添加Serialize成员函数 从而覆盖基类CDocument中定义的Serialize虚成员函数 具体操作步骤略 88 添加Serialize成员函数 89 在S1Doc h中可以看到该虚成员函数的声明 在S1Doc cpp中可以看到该虚成员函数的定义 virtualvoidSerialize CArchive voidCS1Doc Serialize CArchive ar if ar IsStoring storingcode else loadingcode 90 10 2 3使用ClassWizard工具 说明 Serialize函数用来实现文件的串行化操作 当用户选择了 打开 保存 或 另存为 命令 程序框架创建这个文件的CFile对象 关联到新创建的CArchive对象上 并设置CArchive对象的 store 或 load 标记 用这个CArchive对象来调用CDocument派生类的Serialize成员函数 在Serialize函数完成读写操作返回后 自动删除CArchive和CFile对象 91 10 3文档 视图结构 10 3 1文档模板类10 3 2文档类10 3 3视图类 92 10 3文档 视图结构 在MFCAppWizard Step1向导对话框中 当选择SDI或MDI应用程序时 系统默认选择支持文档 视图结构 当选择基于对话框的应用程序时 文档 视图结构支持 复选框是被禁用的 即此时系统不支持文档 视图结构 93 10 3文档 视图结构 文档是用来保存数据以及关于数据的处理的 每当MFCSDI MDI响应 或 菜单命令的时候 都会打开一份文档 视图在Windows中是一个从CView类派生出来的窗口 也是一个可视化的矩形区域 视图用来表示文档的数据 文档的内容通过视图窗口显示给用户 这种文档和视图的结合 称为 文档 视图结构 94 10 3文档 视图结构 每个视图必须依附于一个框架 在SDI中依附于MainFrame 在MDI中依附于ChildFrame 框架是一个Windows窗口 但是在框架上可以放置菜单 工具栏 状态栏等 视图放在框架的客户区 95 10 3文档 视图结构 文档与视图的关系如下图 96 10 3 1文档模板类 文件模板类的作用在MFC中 一个应用程序的主线由应用类体现 而应用类又通过文档模板类在运行时动态创建和管理文档类 视图类和框架窗口类 将它们组成一个有机的整体 共同完成程序的任务 97 10 3 1文档模板类 CDocTemplateCDocTemplate类是一个抽象基类 它定义了文档模板的基本处理函数 或称接口 用于支持文档模板操作 CDocTemplate类有两个派生类 CSingleDocTemplate 用于SDI程序 CMultipleDocTemplate 用于MDI程序 这三个类的声明在 afxwin h 文件中 98 10 3 1文档模板类 CDocTemplate在SDI程序中文档模板类的使用 以S1工程为例 在CS1App的InitInstance函数中 CSingleDocTemplate pDocTemplate pDocTemplate newCSingleDocTemplate 指定这个文档显示时候采用的菜单资源IDR MAINFRAME RUNTIME CLASS CS1Doc RUNTIME CLASS CMainFrame RUNTIME CLASS CS1View AddDocTemplate pDocTemplate 99 10 3 1文档模板类 CDocTemplate在MDI程序中文档模板类的使用 以S1工程为例 在CS1App的InitInstance函数中 CMultiDocTemplate pDocTemplate pDocTemplate newCMultiDocTemplate IDR S1TYPE 同上RUNTIME CLASS CS1Doc RUNTIME CLASS CChildFrame RUNTIME CLASS CS1View AddDocTemplate pDocTemplate 100 10 3 2文档类 CDocument类CDocument是所有文档类的基类 它对文档的建立及归档提供支持 并提供了应用程序用于控制其数据的接口 该类的定义在 afxwin h 文件中 101 10 3 2文档类 文档类的主要成员函数添加视图成员函数voidAddView CView pView 将一个视图连接到文档上 并将视图的文档指针指向该文档 一个文档可以有多个视图 每个文档都维护一个链表来管理与之关联的视图 该链表在CDocument类中的定义为 CPtrListm viewList 102 10 3 2文档类 文档类的主要成员函数删除视图成员函数voidRemoveView CView pView 创建文档成员函数virtualBOOLOnNewDocument 当用户启动应用程序 或选择 菜单时 会触发该函数的执行 打开文档成员函数virtualBOOLOnOpenDocument LPCTSTRlpszPathName 103 10 3 2文档类 文档类的主要成员函数保存文档成员函数virtualBOOLOnSaveDocument LPCTSTRlpszPathName 关闭文档成员函数virtualvoidOnCloseDocument 104 10 3 2文档类 文档类的主要成员函数 例10 9 在例10 1完成的S1工程中 实现在客户区单击鼠标左键连线绘图 提供绘图文件的保存和打开功能 具体操作步骤略 105 10 3 2文档类 在CS1Doc类中添加如下公有成员变量 intm nCount 记录当前点的个数CPointm ptPosition 100 记录点的坐标 CS1Doc CS1Doc TODO addone timeconstructioncodeherem nCount 0 for inti 0 i 100 i m ptPosition i CPoint 0 0 完成成员变量的初始化 106 10 3 2文档类 向视图类中添加 鼠标左键按下 消息映射 107 10 3 2文档类 添加 鼠标左键按下 消息响应函数体代码 voidCS1View OnLButtonDown UINTnFlags CPointpoint 获取指向文档类的指针CS1Doc pDoc GetDocument if pDoc m nCountm ptPosition pDoc m nCount point 将点的个数进行累加pDoc m nCount Invalidate 刷新屏幕CView OnLButtonDown nFlags point 108 10 3 2文档类 说明 Invalidate 是使视图类窗口无效 即需要重绘 的函数 它有一个默认的参数TRUE 即Invalidate TRUE 该函数会产生一个WM PAINT消息 MFC为窗口类提供了WM PAINT的消息处理函数OnPaint OnPaint函数负责重绘窗口 在视图类的OnPaint函数中调用了OnDraw函数 109 10 3 2文档类 修改CS1View OnDraw函数 对鼠标单击过的点进行连线绘图 voidCS1View OnDraw CDC pDC CS1Doc pDoc GetDocument ASSERT VALID pDoc TODO adddrawcodefornativedataherepDC MoveTo pDoc m ptPosition 0 for inti 1 im nCount i pDC LineTo pDoc m ptPosition i 110 10 3 2文档类 运行S1工程 在视图区连续单击鼠标左键可绘成连线 但不能保存当前绘图文件 为了能保存绘制结果 需要对文档类的成员变量m nCount和m ptPosition 100 进行序列化处理 111 10 3 2文档类 修改CS1Doc Serialize函数 voidCS1Doc Serialize CArchive 112 10 3 2文档类 执行S1工程 113 10 3 2文档类 114 10 3 2文档类 MFC对象序列化机制基本概念对象的序列化将对象当前状态 通常由该对象的成员变量指示 写入永久性存储介质 如磁盘文件 或从永久性存储介质中读取对象状态恢复到内存的过程称为对象的序列化 115 10 3 2文档类 MFC对象序列化机制基本概念对象的持久性对象所具有的保存和加载其状态数据的能力称为对象的持久性 持久性对象能够在应用程序结束之前以某种方式将当前的对象状态数据记录下来 当程序再次运行时 通过对这些数据的读取而恢复到上一次任务结束时的状态 116 10 3 2文档类 MFC对象序列化机制CArchiveCArchive类的对象用作将被序列化的对象和存储介质之间的中介物 当进行打开 保存文件操作时 系统会构造一个CArchive对象 并将其与一个打开文件的CFile对象相关联 从CFile对象获得序列化所需的信息 包括文件名和请求的操作是读取还是写入 然后这个CArchive对象会调用CDocument派生类的Serialize成员函数 在Serialize函数完成读写操作后 自动删除CArchive对象和CFile对象 117 10 3 2文档类 MFC对象序列化机制MFC对CObject派生类的序列化提供内置支持 CObject派生类可以重载CObject Serialize函数实现序列化操作 即所有的CObject派生类都是具有持久性的 118 10 3 2文档类 MFC对象序列化机制使一个类可序列化需要完成如下五个步骤 该类直接或间接从CObject类派生 在该类中重载Serialize成员函数 在该类声明文件中使用DECLARE SERIAL宏 该宏只需要将类名作为参数 在该类中定义一个无参构造函数 若一个对象来自文件 MFC必须以无参构造函数动态创建它 然后从文件中读取对象的状态数据 在该类实现文件中使用IMPLEMENT SERIAL宏 该宏需要三个参数 类名 基类名和一个方案号 其中方案号是一个相当于版本号的整数 每当改变了类的序列化数据格式后就应当及时更改此数值 119 10 3 2文档类 MFC对象序列化机制 例10 10 将例10 9中的绘图数据进行封装 创建可序列化类CCurve 实现绘图数据的持久性 classCCurve publicCObject DECLARE SERIAL CCurve public intm nCount CPointm ptPosition 100 CCurve virtual CCurve voidSerialize CArchive 操作步骤 创建 curve h 文件 定义CCurve类来封装曲线位置数据 120 10 3 2文档类 创建 curve cpp 文件 在CCurve类的构造函数中进行数据的初始化 include Curve h IMPLEMENT SERIAL CCurve CObject 0 CCurve CCurve m nCount 0 for inti 0 i 100 i m ptPosition i CPoint 0 0 121 10 3 2文档类 重载Serialize函数 voidCCurve Serialize CArchive 122 10 3 2文档类 打开 S1Doc h 文件 在CS1Doc类中定义数据成员 CS1Doc CS1Doc m pCur newCCurve CCurve m pCur voidCS1Doc Serialize CArchive 打开 S1Doc cpp 文件 修改CS1Doc类构造函数为 修改CS1Doc Serialize函数为 123 10 3 2文档类 打开 S1View cpp 文件 修改单击鼠标消息响应函数为 voidCS1View OnLButtonDown UINTnFlags CPointpoint CS1Doc pDoc GetDocument 获取指向文档类的指针 保存当前鼠标点击位置pDoc m pCur m ptPosition pDoc m pCur m nCount point if pDoc m pCur m nCountm pCur m nCount Invalidate 刷新屏幕CView OnLButtonDown nFlags point 124 10 3 2文档类 修改重绘函数为 voidCS1View OnDraw CDC pDC CS1Doc pDoc GetDocument ASSERT VALID pDoc TODO adddrawcodefornativedataherepDC MoveTo pDoc m pCur m ptPosition 0 for inti 1 im pCur m nCount i pDC LineTo pDoc m pCur m ptPosition i 125 10 3 2文档类 执行S1工程 实现了单击鼠标左键连线绘图 可对绘图文件进行保存和打开 126 10 3 3视图类 CView在MFC 文档 视图 结构中 CView类是所有视图类的基类 该类的定义在 afxwin h 文件中 它提供了用户自定义视图类的公共接口 视图类负责如下工作 从文档类中将文档中的数据取出后显示给用户 接受用户对文档中数据的编辑和修改 将修改的结果反馈给文档类 由文档类将修改后的内容保存到磁盘文件中 127 10 3 3视图类 在视图类的派生类中的重载函数获取文档指针成员函数CDocument GetDocument const 返回与视图关联的文档对象的指针 如果视图没有与文档关联则返回NULL值 重绘客户区成员函数virtualvoidOnDraw CDC pDC 0 负责将文档的内容在视图窗口中显示 并在需要时对窗口内容进行重绘 128 10 3 3视图类 说明 当视图窗口的内容需要重绘时 如第一次创建窗口 窗口改变位置和大小 从打开的文件中显示数据等等 Windows就会给应用程序发送WM PAINT消息 从而调用视图类相应的消息处理函数OnPaint 在CView类中定义 OnPaint 函数主要就是调用OnDraw 函数 由于该虚函数在派生类中被重载 所以调用的就是派生视图类的OnDraw 函数 129 10 3 3视图类 在视图类的派生类中的重载函数新建窗口成员函数virtualBOOLPreCreateWindow CREATESTRUCT cs 通过修改CREATESTRUCT结构体类型数据而修改窗口风格 130 10 3 3视图类 CView类层次 131 132 10 4MFCWindows应用程序典型执行过程 10 4 1Windows应用程序执行过程10 4 2MFCWindows应用程序执行过程 133 10 4 1Windows应用程序执行过程 例10 11 在VisualC 中使用向导创建一个实现图10 45功能的 Win32Application 类型的应用程序 操作步骤 在New对话框的 Project 标签中选择 Win32Application 输入工程名 S3 保存路径为 E Samples 134 135 在Win32Application Step1of1对话框 选择创建一个典型的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论