- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章文档视图.doc
第4章 文档与视图
MFC提供了将应用程序的数据与显示分开的文档/视图结构,它为应用程序提供了统一的框架。如
正在运行中的SDI应用程序中的对象
4.1 文档/视图体系
文档(document)对应于用户的数据(可以是文本、数值、图像、声音、视频等),它可以从磁盘文件中读入,也可写入磁盘文件,用户还可以定义、修改、管理这些数据。对应的MFC类为CDocument。
视图(view)是一种窗口对象,对应于框架窗口的客户区,它负责在屏幕和打印机上显示和输出数据,为用户提供观察、选择、编辑文档数据的交互界面。对应的MFC类为CView。
文档/视图结构有两种主要的方式:SDI(Single Document Interface,单文档界面)和MDI(Multiple Document Interface,多文档界面)。在.NET中新添加了一种MTDI(Multiple Top-level Document Interface,多顶级文档界面)。
应用程序的文档/视图结构种类,可以在创建MFC应用程序时,在“MFC应用程序向导”对话框的“应用程序类型”页中设置(缺省为MDI),在该对话框页中还可以选择是否具有“文档/视图结构支持”(缺省是选中)。参见下图。
SDI应用程序只有一个框架窗口(类)和一个视图窗口(对应于框架窗口的客户区),且只有一个文档类,每次只能打开一个文档。这里的文档和视图一般是一一对应的。
MDI应用程序有一个主框架窗口(类),可有任意多个子框架窗口和对应的视图客户区窗口,也可有多个文档类,可以同时打开多个文档/窗口。这里,每个视图对应于一个文档,而每个文档则可对应于多个视图。
MTDI类似于MDI,只是MDI中的每个文档视图窗口都是主框架窗口的子窗口(只能位于主框架窗口的客户区内);而MTDI的文档视图窗口都是顶层窗口,位于主框架窗口之外。
SDI MDI MTDI
不同的文档界面 MDI/MTDI的一个文档可以对应多个视图
1.文档模板类
文档、框架窗口与视图通过文档模板联系在一起,MFC的文档模板类为CDocTemplate。对SDI与MDI,它有两个对应的派生类CSingleDocTemplate与CMultiDocTemplate:
它们的构造函数的参数都一样:
C[Single|Multi]DocTemplate ( // 文档模板构造函数
UINT nIDResource, // 文档类型的资源ID
CRuntimeClass* pDocClass, // 派生文档类对象的指针
CRuntimeClass* pFrameClass, // [派生]框架窗口类对象的指针
CRuntimeClass* pViewClass // 派生视图类对象的指针
);
CWinApp类创建文档模板的操作分两步进行,首先用文档模板类的构造函数创建一个SDI或MDI文档模板的实例,然后调用CWinApp类的成员函数AddDocument将该模板添加到应用程序的模板列表中。创建文档模板的操作一般在派生应用程序类的InitInstance成员函数中完成。
例如:(SDI)
BOOL CDrawApp::InitInstance() {
……
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME,
RUNTIME_CLASS(CDrawDoc),
RUNTIME_CLASS(CMainFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CDrawView));
AddDocTemplate(pDocTemplate);
……
}
其中,RUNTIME_CLASS宏返回一个指向CRunTimeClass类的指针:
CRuntimeClass* RUNTIME_CLASS( class_name )
又例如:(MDI)
BOOL CImageApp::InitInstance() {
……
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_BMPTYPE,
RUNTIME_CLASS(CImageDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS
文档评论(0)