第1章单文档与多文档 本章主要介绍Vsua1C++中的 文档/视图结构的工作机制
1 第 11章 单文档与多文档 本章主要介绍Visual C++中的 文档/视图结构的工作机制
111概述
2 11.1 概述
111单文档界面与多文档界面 SDI的应用程序 只有一个窗口 VC的MFC库支 单文档界面(SDD 持三种不同↓多文档界面MD MDI的应用程序每次 的应用程序 可以读写多个文件或 基于对话框的应用程序 文档,可同时对多个 使用 Appwizard创建 文档进行操作,可以 SD和MD界面的应 有多个子窗口 用程序的过程几乎完 全一样 在创建SDI界面的应用程序时,不生成 CHild Frame类, MAin Frame类的基类 主要差别 为 CframeWnd 在创建MD界面的应用程序时, CMain frame类的基类为 CMDIFrame Wnd
3 11.1.1单文档界面与多文档界面 VC的MFC库支 持三种不同 的应用程序 单文档界面(SDI) 多文档界面(MDI) 基于对话框的应用程序 SDI的应用程序 只有一个窗口 MDI的应用程序每次 可以读写多个文件或 文档,可同时对多个 文档进行操作,可以 有多个子窗口 主 要 差 别 在创建SDI界面的应用程序时,不生成 CChildFrame类,CMainFrame类的基类 为CFrameWnd 在创建MDI界面的应用程序时, CMainFrame类的基类为 CMDIFrameWnd 使用AppWizard创建 SDI和MDI界面的应 用程序的过程几乎完 全一样
视图是文档的不同表现形式,一个html 语言的文件,在浏览器里和在记事本中打 开的表现形式是不同的但它们操作的是同 个文件这就是一个文档对应两视图 由于每一个文档可以有多个视图,但 每个视图只能对应于一个确定的文档 多文档程序需要解决的问题仅仅是多 个文档的数据管理方法的问题 多文档程序,最初的文档模板只支持主窗口,但每次打开 个新文档时都调用 CDocument的函数 OnNewDocument,建 立一个由 CMDIChildWnd派生的新的MD子窗口,这些窗口 中保存着各种已打开的文档,所有的细节都由MFC库处理4
4 由于每一个文档可以有多个视图,但 每个视图只能对应于一个确定的文档 多文档程序需要解决的问题仅仅是多 个文档的数据管理方法的问题 多文档程序,最初的文档模板只支持主窗口,但每次打开一 个新文档时都调用CDocument的函数OnNewDocument,建 立一个由CMDIChildWnd派生的新的MDI子窗口,这些窗口 中保存着各种已打开的文档,所有的细节都由MFC库处理 视图是文档的不同表现形式,一个*.html 语言的文件,在浏览器里和在记事本中打 开的表现形式是不同的但它们操作的是同 一个文件这就是一个文档对应两视图
112文档视图结这北良我们 的过程将数据保存 到磁盘文件或数据库中 令消息可以 被多种对象 对数据进行管理和维 处理,这些 护,数据保存在文档 文档类还可处理来自如 类的成员变量中 菜单、工具栏按钮和加对象除了窗 速键的啊 M COMMAND消息口和视图外 还可以是 在文栏/视图结构中 文档、文档 除 WM COMMAN外,文档不模板或应用 在文档和用户之(能处理其它的 Windows消息』程序本身 间起中介作用 视图可以直接或间接 的访问文档类中的成 它可以接收用户的输入 员变量,它从文档类 ,并接受用户的修改 中而不是从存储介质这一点与 Windows,消息 中)将文档中的数据取和控件通知消息不同, 通过调用文档和视图的接口将修出来,然后在屏幕上因为 Windows,消息和控 改的信息反馈给文档类,实际的显示文档的数据 件通知消息就只能被 数据更新仍然是由文档来完成的 窗口和视图处理
5 11.1.2 文档/视图结构 在文档/视图结构中 对数据进行管理和维 护,数据保存在文档 类的成员变量中 文档类通过串行化 的过程将数据保存 到磁盘文件或数据库中 文档类还可处理来自如 菜单、工具栏按钮和加 速键的WM_COMMAND消息 除WM_COMMAND外,文档不 能处理其它的Windows消息 由此我们可 以看出,命 令消息可以 被多种对象 处理,这些 对象除了窗 口和视图外 ,还可以是 文档、文档 模板或应用 程序本身 这一点与Windows消息 和控件通知消息不同, 因为Windows消息和控 件通知消息就只能被 窗口和视图处理。 通过调用文档和视图的接口将修 改的信息反馈给文档类,实际的 数据更新仍然是由文档来完成的 在文档和用户之 间起中介作用 视图可以直接或间接 的访问文档类中的成 员变量,它从文档类 中(而不是从存储介质 中)将文档中的数据取 出来,然后在屏幕上 显示文档的数据 它可以接收用户的输入 ,并接受用户的修改
文档/视图结构的工作机制 视图通过 GetDocument 成员函数获得指向相关 联的文档对象的指针 通过该指针调用文 档类的成员函数来 从文档中读取数据 视图把数据显示 于计算机屏幕上 用户通过与视图的 视图通过相关联的文档类 交互来查看数据并 的成员函数将经过修改的 对数据进行修改 数据传递给文档对象 文档对象获得修改过的数据之后,对 其进行必要的修改,最后保存到永久 介质(如磁盘文件)中
6 文档/视图结构的工作机制 视图通过GetDocument 成员函数获得指向相关 联的文档对象的指针 通过该指针调用文 档类的成员函数来 从文档中读取数据 视图把数据显示 于计算机屏幕上 用户通过与视图的 交互来查看数据并 对数据进行修改 视图通过相关联的文档类 的成员函数将经过修改的 数据传递给文档对象 文档对象获得修改过的数据之后,对 其进行必要的修改,最后保存到永久 介质(如磁盘文件)中
应用程序对象 消息首先传递入框 架窗口和视图 回x 文件②)查看(D品示()帮助D 框架窗口对象 NolsIshl 视图对象 文档视图类间的 信息交换 toolbar 文档对象 A 这是关于工具条的样例程序 就绪 数字 SDI文档视图应用程序示意图
7 SDI文档/视图应用程序示意图
1113SD程序中文档、视图对象的创建过程 SD程序中框架窗口、文档和视图的创建是在应用程序对象的 Initlnstance(成员函数中通过文档模板类完成的: CSingleDocTemplate* pDocTemplate;∥刨建单文档模板类对象 pDocTemplate new CSingleDocTemplate (IDR_ MAINFRAME, RUNTIME CLASS( CMyDoc2, ICMy Doc是应用程序中的文档类 RUNTIME CLASS( CMain Frame), CMain Frame是应用程序中的框架窗口 RUNTIME CLASS( CMyView)}; CMyView是应用程序中的视图类 AddDocTemplate(pDoc Template);加载文档模板类对象到文档模板列表 CCommandlinelnfo cmdInfo Parse Line(cmdInfo;初始化 CCommand Linelnfo对象 (! Process shellcommand( cmdInfo)据对象中的信息启动程序 return FAlse m_pMainWnd-> ShowWindow(SW_ SHOW); m_pMainWnd-> UpdateWindow0 ∥显示和更新窗口
8 11.1.3 SDI程序中文档、视图对象的创建过程 SDI程序中框架窗口、文档和视图的创建是在应用程序对象的 InitInstance()成员函数中通过文档模板类完成的: CSingleDocTemplate * pDocTemplate; //创建单文档模板类对象 pDocTemplate = new CSingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (CMyDoc), //CMyDoc是应用程序中的文档类 RUNTIME_CLASS (CMainFrame), //CMainFrame是应用程序中的框架窗口 RUNTIME_CLASS (CMyView) ); //CMyView是应用程序中的视图类 AddDocTemplate(pDocTemplate); //加载文档模板类对象到文档模板列表 … CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); //初始化CCommandLineInfo对象 if(! ProcessShellCommand(cmdInfo)) //据对象中的信息启动程序 return FALSE; m_pMainWnd -> ShowWindow(SW_SHOW); m_pMainWnd -> UpdateWindow(); //显示和更新窗口
1114SDⅠ程序的消息传递过程 DefwindowProc 当用户选择了菜单项, 单击了快捷键或工具条 应用程序对象 按钮,系统就会发送 WM COMMAND消息。框 架窗口实际上是大多数 框架窗口 WM COMMAND消息的接 受者,但WM_ COMMAND 文档模板 消息还可以在视图、文 档,甚至应用程序类中 文档对象 被处理。 活动视图
9 11.1.4 SDI程序的消息传递过程 当用户选择了菜单项, 单击了快捷键或工具条 按钮,系统就会发送 WM_COMMAND消息。框 架窗口实际上是大多数 WM_COMMAND消息的接 受者,但WM_COMMAND 消息还可以在视图、文 档,甚至应用程序类中 被处理
112 Doc/view框架的主要成员 Doc/iew框架虽然可以调用成百上千个不 同的类,但是核心类只有五个 CWinApp CDocument CⅤiew CDocTemplate CFramewnd 10
10 11.2 Doc/View框架的主要成员 Doc/View框架虽然可以调用成百上千个不 同的类,但是核心类只有五个: CWinApp CDocument CView CDocTemplate CFrameWnd