第5章文档/视结构
第5章 文档/视结构
文档/视结构是 Micros公司为VuaC++ Windows程 序设计提出的一种新的编程机制。它是我们在 Visual c+ 中使用MFC开发基于文档的应用程序的基本框架,在这 个框架中,数据的维护和显示是分别由两个不同的且彼 此紧密相关的两个对象—文档和视负责的。在文档/视 结构中,文档相当于一个数据容器或数据管理中心,而 视却相当于显示数据的窗口或者是和数据发生交互的窗 口。因此一个完整的基于MFC开发的应用程序一般至少 由四个类组成(SD应用): CWinApp应用类 FRame Wnd窗口框架类, CDocument文档类, CView视 类( Visual c++V60中支持创建不带文档-视结构的应 用)。文档/视结构在很多场合与传统的编程方式相比要 更有利于这一类应用程序的编写
文档/视结构是Microsoft公司为Visual C++ Windows程 序设计提出的一种新的编程机制。它是我们在Visual C++ 中使用MFC开发基于文档的应用程序的基本框架,在这 个框架中,数据的维护和显示是分别由两个不同的且彼 此紧密相关的两个对象——文档和视负责的。在文档/视 结构中,文档相当于一个数据容器或数据管理中心,而 视却相当于显示数据的窗口或者是和数据发生交互的窗 口。因此一个完整的基于MFC开发的应用程序一般至少 由四个类组成(SDI应用):CWinApp应用类, CFrameWnd窗口框架类,CDocument文档类,CView视 类(Visual C++ V6.0中支持创建不带文档-视结构的应 用)。文档/视结构在很多场合与传统的编程方式相比要 更有利于这一类应用程序的编写
构造文档对象 使用 CFramewnd: Create创 构造框架窗口对象 建 Windows窗囗 创建视对象 框架 创建文档框架 处理 WM CREATE消息。 MAinframe: OnCreate调用 创建 Windows窗口 CFrameWnd: On Createclient 创建用户区 在 CView On Create中处 是否打开 理 WM CREATE消息 否 是 打开文件并创建档案 调用 CDocument:调用 CDocument 调用 CDocument: Serialize 文档 OnNewDocument OnOpenDocument 读取文件 关闭档案和文件
在应用中一个视对应一个文档,但一个文档可以包含差全视 个应用中只用一个框架窗口,对多文档界面来讲可能有多个 MDI子窗口。每一个视都是一个子窗口,在单文档界面中父窗 口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个 多文档应用中可以包含多个文档模板,一个模板定义了一个文 档和一个或多个视之间的对应关系。同一个文档可以属于多个 模板,但一个模板中只允许定义一个文档。同样一个视也可以 属于多个文档模板
在应用中一个视对应一个文档,但一个文档可以包含多个视。 一个应用中只用一个框架窗口,对多文档界面来讲可能有多个 MDI子窗口。每一个视都是一个子窗口,在单文档界面中父窗 口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个 多文档应用中可以包含多个文档模板,一个模板定义了一个文 档和一个或多个视之间的对应关系。同一个文档可以属于多个 模板,但一个模板中只允许定义一个文档。同样一个视也可以 属于多个文档模板
应用程序对象 Doc文档模板A Doc2文档模板B Doc3实例Doc1实例Doc2实例 Docl实例Doc2实例 图52有两种文档类型的MD应用程序
应用程序对象 Doc文档模板A Doc2文档模板B Doc1实例 Doc2实例 Doc3实例 Doc1实例 Doc2实例 图5.2 有两种文档类型的MDI应用程序
文档、视和应用程序框架 Visual c++6.0是一个功能强大、用户界面友好而倍受程序员青 睐的开发工具。但是,在当前的 Microsoft基本类库4x版本中,大约有 将近200多个类,数千个函数,加之 Microsoft公司隐藏了一些技术细节 ,使得人们深入学习MFC变得有些困难。实际上,在 Visual c++开发平 台下,MFC的 App Wizard可以生成三种类型的应用程序: 基于对话框的应用 单文档应用(SD) 多文档应用(MDI SD和MD均是文档/视窗结构的应用程序类型。早些时候, MFC应用程序模型只是使用应用程序对象和主窗口对象的简单模型。 在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中 在框架窗口的客户区中,该数据被输出到显示器。随着MFC新版本问 世,一种新式应用程序结构——文档视结构出现了。在这种结构中, FRame Wnd繁重的任务被委派给几个不同类,实现了数据存储和显示 的分离
文档、视和应用程序框架 Visual C++ 6.0 是一个功能强大、用户界面友好而倍受程序员青 睐的开发工具。但是,在当前的Microsoft 基本类库4.x 版本中,大约有 将近200多个类,数千个函数,加之Microsoft 公司隐藏了一些技术细节 ,使得人们深入学习MFC变得有些困难。实际上,在Visual C++开发平 台下,MFC的AppWizard可以生成三种类型的应用程序: l 基于对话框的应用 l 单文档应用(SDI) l 多文档应用(MDI) SDI和MDI均是文档/视窗结构的应用程序类型。早些时候, MFC应用程序模型只是使用应用程序对象和主窗口对象的简单模型。 在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中, 在框架窗口的客户区中,该数据被输出到显示器。随着MFC新版本问 世,一种新式应用程序结构——文档/视结构出现了。在这种结构中, CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示 的分离
般情况下,采用文档/视结构的应用程序(如SDI应用)至 少应由以下4个对象组成: 应用程序对象:该对象是一个从 CWinApp类派生的类的对 象,它是应用程序的中心。应用程序对象将消息沿消息映射网络分 配给它的所有子程序。 框架窗口对象:该对象是一个从 FRame Wnd类派生的类的 对象 文档对象:该对象是一个从 CDocument类派生的类的对象 它主要用来存储应用程序中的数据,并把这些信息提供给应用程序 的其它部分 视窗对象:该对象是从CVew类派生的类的对象,它与其父 框架窗口用户区对齐。视窗接受用户对应用程序的输入并显示相关 联的文档数据
一般情况下,采用文档/视结构的应用程序(如SDI应用)至 少应由以下4个对象组成: 应用程序对象:该对象是一个从CWinApp类派生的类的对 象,它是应用程序的中心。应用程序对象将消息沿消息映射网络分 配给它的所有子程序。 框架窗口对象:该对象是一个从CFrameWnd 类派生的类的 对象。 文档对象:该对象是一个从CDocument类派生的类的对象, 它主要用来存储应用程序中的数据,并把这些信息提供给应用程序 的其它部分。 视窗对象:该对象是从CView类派生的类的对象,它与其父 框架窗口用户区对齐。视窗接受用户对应用程序的输入并显示相关 联的文档数据
通常,应用程序数据存放于简单模型中的框架窗口中。在文档/视结 构应用中,该数据被放在称为文档的独立数据对象中。当然,文档不 定就是文字,文档可以是表现应用程序使用的数据集的抽象术语。而用 户输入处理及图形输出功能从框架窗口转向视图。单独的视窗完全遮蔽 框架窗口的客户区,这意味着即使程序员直接绘画至框架窗口的客户区 视图仍遮蔽绘画,在屏幕上不出现任何信息。所以输出必须通过视图。 框架窗口仅仅是个视图容器。注意:ⅥswlC++可以建立只有视窗而没 有文档的应用程序框架 CDocument类对文档的建立及归档提供支持并提供应用程序用于控制 其数据的接口。MD应用程序可以处理多个类型的文档,每个类型的文 档拥有一个相关联的文档模板对象。文档对象隐藏在视窗的后面,提供 由视图对象显示的信息。文档至少有一个相关联的视图。视图只能与一 个文档相关联 在文档/视方式中,对象的建立是由文档模板来管理的,它是 CDoc Template类派生类的对象,建立并维护框架窗口,文档及视
通常,应用程序数据存放于简单模型中的框架窗口中。在文档/视结 构应用中,该数据被放在称为文档的独立数据对象中。当然,文档不一 定就是文字,文档可以是表现应用程序使用的数据集的抽象术语。而用 户输入处理及图形输出功能从框架窗口转向视图。单独的视窗完全遮蔽 框架窗口的客户区,这意味着即使程序员直接绘画至框架窗口的客户区, 视图仍遮蔽绘画,在屏幕上不出现任何信息。所以输出必须通过视图。 框架窗口仅仅是个视图容器。注意:Visual C++可以建立只有视窗而没 有文档的应用程序框架。 CDocument类对文档的建立及归档提供支持并提供应用程序用于控制 其数据的接口。MDI应用程序可以处理多个类型的文档,每个类型的文 档拥有一个相关联的文档模板对象。文档对象隐藏在视窗的后面,提供 由视图对象显示的信息。文档至少有一个相关联的视图。视图只能与一 个文档相关联。 在文档/视方式中,对象的建立是由文档模板来管理的,它是 CDocTemplate类派生类的对象,建立并维护框架窗口,文档及视
总之,在文档视方式中,文档和视是分离的,即:受档甪手保存数猸, 而视是用来显示这些数据。文档模板维护它们之间的关西。这种文档/视结 构在开发大型软件项目时特别方便、有用。 在文档/视应用程序中, CWinApp派生类对象拥有并控制文档模板,文 档模板产生文档、框架窗口及视窗。从用户的角度来看,视窗实际上是 个普通的窗口。象其他基于 Widnows应用程序的窗口一样,人们可以改变 它的尺寸大小,对它进行移动,也可以随时关闭它。若从程序员的角度来 看,视窗实际上是一个从MFC类库中的CVew类所派生出的类的对象。文 档对象是用来保存数据的,而视窗对象是用来显示数据的,并且允许对数 据进行编辑。SD或MD的文档类是由 DOcumen类派生出来的,它可以有 个或多个视类,而这些视类最终都是由Cvew类派生出来的。视对象只 有一个与之相联系的文档对象,它所包含的Ciew: retdocumen函数允许 应用在视中得到与之相联系的文档,据此,应用程序可以对文档类成员函 数及公共数据成员进行访问。如果视对象接受到了一条消息,表示用户在 编辑控制中输入了新的数据,此时,视就必须通知文档对象对其内部数据 进行相应的更新。如果文档数据发生了变化,则所有的视窗都必须被通知 到,以便它们能够对所显示的数据进行相应的更新 Document: UpdateAllviews函数即可完成此功能
总之,在文档/视方式中,文档和视是分离的,即:文档用于保存数据, 而视是用来显示这些数据。文档模板维护它们之间的关西。这种文档/视结 构在开发大型软件项目时特别方便、有用。 在文档/视应用程序中,CWinApp派生类对象拥有并控制文档模板,文 档模板产生文档、框架窗口及视窗。从用户的角度来看,视窗实际上是一 个普通的窗口。象其他基于Widnows应用程序的窗口一样,人们可以改变 它的尺寸大小,对它进行移动,也可以随时关闭它。若从程序员的角度来 看,视窗实际上是一个从MFC类库中的CView类所派生出的类的对象。文 档对象是用来保存数据的,而视窗对象是用来显示数据的,并且允许对数 据进行编辑。SDI或MDI的文档类是由CDocument类派生出来的,它可以有 一个或多个视类,而这些视类最终都是由CView类派生出来的。视对象只 有一个与之相联系的文档对象,它所包含的CView::GetDocument函数允许 应用在视中得到与之相联系的文档,据此,应用程序可以对文档类成员函 数及公共数据成员进行访问。如果视对象接受到了一条消息,表示用户在 编辑控制中输入了新的数据,此时,视就必须通知文档对象对其内部数据 进行相应的更新。如果文档数据发生了变化,则所有的视窗都必须被通知 到,以便它们能够对所显示的数据进行相应的更新。 Document::UpdateAllViews函数即可完成此功能
操作事件与应用程序框架 我们在 Windows应用中,输入数据主要是通过鼠标、键盘和点击菜单条和 工具条来进行人机交互的。操作事件当然与这些输入数据操作有关 鼠标操作是目前 Windows软件的主要人机互动方式。 Windows软件根据鼠 标动作产生的消息作相应处理。因此,鼠标消息是我们经常要处理的消息, 其消息主要分为:鼠标移动、按钮按下、松开、双击等消息。我们可以利用 Class Wizard为这些消息添加相应的消息映射 键盘同鼠标一样是 Windows应用程序共享的全局硬件资源,键盘事件是由 消息、消息映射极其消息处理函数来处理的。 Windows发送键盘消息给具有 输入焦点的窗口,通知窗口用户正击什么键,通常这些消息有: WM KEYDOWN和 WM KEYUP。除At外,所有键发送 WM KEYDOWN和 WM KEYUP消息。利用菜单接受用户命令是一种很简单的交互方法,同时 也是一种很有效的方法。通常菜单作为一种资源存储在文件中,因此我们 以在设计时就利用资源编辑器设计好一个菜单。关于使用 Visual o++设计菜 单前面已述这里我就不再多讲了,但这里我要提醒大家是你在编写菜单时应 该尽量在属性对话框的底部提示( Prompt)处输入文字,这虽然不是必要的, 但MFC在有状态栏和工具条的情况下会使用该文字,文字的格式为“状态栏 显示说明n工具条提示
操作事件与应用程序框架 我们在Windows应用中,输入数据主要是通过鼠标、键盘和点击菜单条和 工具条来进行人机交互的。操作事件当然与这些输入数据操作有关。 鼠标操作是目前Windows 软件的主要人机互动方式。Windows软件根据鼠 标动作产生的消息作相应处理。因此,鼠标消息是我们经常要处理的消息, 其消息主要分为:鼠标移动、按钮按下、松开、双击等消息。我们可以利用 ClassWizard为这些消息添加相应的消息映射。 键盘同鼠标一样是Windows应用程序共享的全局硬件资源,键盘事件是由 消息、消息映射极其消息处理函数来处理的。Windows 发送键盘消息给具有 输入焦点的窗口 , 通知窗口用户正击什么键 , 通常这些消息有: WM_KEYDOWN和WM_KEYUP。除Alt外,所有键发送WM_KEYDOWN和 WM_KEYUP消息。利用菜单接受用户命令是一种很简单的交互方法,同时 也是一种很有效的方法。通常菜单作为一种资源存储在文件中,因此我们可 以在设计时就利用资源编辑器设计好一个菜单。关于使用Visual C++ 设计菜 单前面已述这里我就不再多讲了,但这里我要提醒大家是你在编写菜单时应 该尽量在属性对话框的底部提示(Prompt)处输入文字,这虽然不是必要的, 但MFC在有状态栏和工具条的情况下会使用该文字,文字的格式为“状态栏 显示说明\n工具条提示