没有合适的资源?快使用搜索试试~ 我知道了~
首页深入分析MFC文档视图结构(项目实践)
深入分析MFC文档视图结构(项目实践)
4星 · 超过85%的资源 需积分: 14 28 下载量 15 浏览量
更新于2023-03-03
评论
收藏 58KB DOC 举报
文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFC AppWizard就可以很轻松地获得一个支持Document/View Architecture的MFC程序框架,Document/View Architecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自拔。加上我们更多的人都没有经过Windows SDK Programming 的学习和经历就直接进行MFC Programming的学习和开发,更是面对一堆的代码不知所措。
资源详情
资源评论
资源推荐
深入分析 MFC 文档视图结构(项目实践)
文档视图结构(Document/ViewArchitecture)是 MFC 的精髓,也是 Observer 模式
的具体实现框架之一,Document/ViewArchitecture 通过将数据和其表示分开,提供了
很好的数据层次和表现层次的解耦。然而,虽然我们使用 MFCAppWizard 就可以很轻松
地获得一个支持 Document/ViewArchitecture 的 MFC 程序框架,Document/ViewA
rchitecture 本身的复杂性加上 VC 产生的一系列代码足够让我们眼花缭乱,一时陷入云里
雾里不可自拔。加上我们更多的人都没有经过 WindowsSDKProgramming的学习和经
历就直接进行 MFCProgramming 的学习和开发,更是面对一堆的代码不知所措。
之于 Document/ViewArchitecture,侯捷先生的《深入浅出 MFC》一书确实进行了很
深入的分析和研究,网络上也有很多在侯捷先生著述的基础上的进一步的文章出现,但是
个人觉得这里面有一点瑕疵(仅代表 k_eckel 浅见):太过深入,这些分析和研究都最终
会定位到 WindowsSDK 中窗口的创建过程、MFC 中对 Document/ViewArchitecture
支持所提供的复杂无序的宏等对于没有 WindowsSDKProgramming经验和经历的学习
者和对于 MFC 不是很熟悉的学习者无异于是徒增烦恼,一个本来就很复杂的问题更加地复
杂化了。我的观点是这个过程是必要的,然而不是每个人所必需的,或者说不是每个人在
初期学习和绝大多数项目开发中所必需的。我向来对众多的仅仅学会了拖拉点拽就以为会
了 MFC(侯捷先生在《深入浅出 MFC》一书中对这个群体有一个照面,这里不罗嗦)不
以为然,但是我依然认为轻量级学习成本是重要的,容易上手,易于接受是一门技术成功
或者说有价值的一个很大的决定性因素。因此提供一个轻量级的学习过程对于学习来说是
很有必要性的,本系列文章就遵循这样一个理念,对 MFC 中 Document/ViewArchitect
ure 进行一个分析(姑且也可以称之为深入),尽量将对 Document/ViewArchitecture
的理论研究(侯捷先生书中很多内容)和实际的项目开发结合起来,最后提供一个简单但
是全面的 Document/ViewArchitecture 项目开发(主要是界面框架设计和开发)的实
际例子,供参考。
1必备基础知识概述
1.1MFC 文档视图结构程序结构总揽
当我们使用 MFCAppWizard 生成一个 MFC 程序,选用所有 默认的设置(当然也是
MultipleDocuments,本文讨论主要基于 MultipleDocuments,对于 SingleDocum
ent 情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且
更 加 常 用 。 ) , 假 设 你 的 程 序 名 称 为 A, 则 你 会 得 到
CMainFrame 、 CChildFrame 、 CAboutDlg 、 CADoc 、 CAView 、 CAApp6 个 类
(SingleDocument仅少一个 CChildFrame 类,其余均同)。这些类的具体含义将在
后面给出,这里先要给出一个 MFC支持文档视图结构程序(以下简称 App)的主要组成:
u一个 App(对应类 CAApp)可以包含多个文档模版(CDocTemplate),但是
MFCAppWizard(无论是 SDI 还是 MDI)都只是默认生成一个。但是在实际开发中一个
文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。这个结构是通过
MFC 中 CWinApp 的 成 员 变 量 CDocManager*m_pDocManager 实 现 的 , 我 们 的
CAApp 正是继承自 MFC 提供的 CWinApp 类。
uCDocManager 类则拥有一个指针链表 CPtrListm_templateList 来维护这些文档
模 版 。 这 些 文 档 模 版 都 是 在 CAApp : : InitInstance ( ) 中 通 过
AddDocTemplate(pDocTemplate)。
uCDocTemplate 拥有 3 个成员变量,分别保存着 Document、View、Frame 的
CRuntimeClass 指针,另外持有成员变量 m_nIDResource,用来指定这个 Document
显 示 时 候 采 用 的 菜 单 资 源 。 这 4 份 数 据 都 在 CAApp : : InitInstance ( ) 中
CDocTemplate 的构造函数中指定。在 Document 中拥有一个回指 CDocTemplate 的
指针(m_pDocTemplate)。
u一个文档可以有多个视图,由 Document 中成员变量 CPtrListm_ViewList 维护
uCFrameWnd 拥 有 一 个 成 员 变 量 CView*m_pActiveView 指 向 当 前 活 动 的
View。
uCView 中拥有一个成员 变量 CDocument*m_pDocument 指向 该视图相 关的
Document。
[注解]:① MFCSDI/MDI 程序默认都默认生成了一个文档模版,并将这个文档模版 Add
到其文档模版的链表中,由于这是 MFC 默认提供的,因此这个文档模版会被插入到文档模
版的第一个位置,而 MFC 也是通过这个文档模版的特定位置可以确定的。默认情况下,当
我们点击 File(Open)/File(New)的时候,这个文档模版会被启用。
除了侯捷先生在《深入浅出 MFC 中列出的以上的深入分析,我们还应该(很大程度
上更加重要)掌握以下的关于 MFCSDI/MDI 的知识:
u文档的本质:文档是用来保存数据以及关于数据的处理的,每当 MFCSDI/MDI 响
应 File(Open)/File(New)的时候都会打开一份文档。文档可以拥有多个视图。文档
和视图的关系可以这样理解:文档是被视图观察的对象。
u视图本质:视图在 Windows 中就是一个窗口,也就是一个可视化的矩形区域。视
图 是 用 来 表 示 文 档 的 数 据 的 。 但 是 每 个 视 图 必 需 依 附 于 一 个 框 架 ( SDI 中 是
MainFrame,MDI 是 ChildFrame)。当然你可以自己去 Create 一个视图,并且去显
示它。
u框架的本质:框架实际也是一个 Windows 窗口。但是在框架上可以放置菜单、工
具栏、状态栏等。而视图则放在框架的客户区。因此 MFC 中我们看到的窗口实际上
Frame 和 View 共同作用的结果。
u在某一时刻,程序中只有一个活动的文档、框架和视图,即当前的文档、框架、视
图。
1.2MFCSDI/MDI 各个类之间的互访
在实际项目开发中用的最多就是各个类之间的互访问,这里将网络上和书籍中提到的
做了一个总结,也是笔者在实际开发中都用到过的。
访问对象
访问位置
访问实现
应用程序 App
任何位置
①AfxGetApp();
②在要使用应用程序 App 的文件中加入:
externCAApptheApp,然后直接使用全局的 theApp 变量。
主框架窗口
任何位置
①AfxGetMainWnd();
②AfxGetApp()->m_pMainWnd;
视图
框架类中
GetActiveView();//当前的活动视图
文档类中
GetFirstViewPosition();//可以获取全部视图
GetNextView();
文档
文档类中
GetDocument();
文当模版类中
GetFirstDocPosition();//该文档模版对应全部文档
GetNextDoc();
框架类中
GetActiveDocument();//当前活动文当
子框架类(MDI 中)
主框架类中
①MDIGetActive();
②GetActiveFrame();
视图类中
GetParentFrame();
文档模版
文档类中
GetDocTemplate();
应用程序 App 中
GetFirstDocTemplatePosition();
GetNextDocTemplate();
说明:1)以上给出的都是方法,实际访问中可能还要进行以下简单的处理,如类型
转换,循环遍历等;
2)可能没有列举完所有可能位置的互访问,但可以通过他们的组合得到。
2文档、视图、框架之间的关联
MFCSDI/MDI 中的核心就在于文档、视图、框架之间的关联,形成了一个有机的可
运作的整体。MFC 提供了默认的关联关系,但是在实际的项目开发中很多时候需要动态进
行他们的之间的关联。
2.1文档和视图间的关联
使用 MFCAppWizard 声称 MFCSDI/MDI 程序,在 App 类的 InitInstance()方
法中有如下代码(假设 Project 名称均为 Test):
uSDI 中
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CTestView));
剩余16页未读,继续阅读
dengwei543356465
- 粉丝: 0
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论4