📄 chap7_2.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=gb_2312-80">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>7.2文档视结构程序实例</title>
<link rel="stylesheet" href="../../../cpcw.css"></head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<div align="center"><center>
<table border="0" cellpadding="0" cellspacing="0" width="85%">
<tr bgcolor="#FFFFFF">
<td>
<div align="center"><center><table border="0"
cellpadding="0" cellspacing="0" width="615" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"><font
size="5"></font> </td>
<td width="238" bgcolor="#000000" height="20">
<p
align="right"><a href="../../vc.htm"><span style="text-decoration: none"><font
color="#FFFFFF">电脑报Visual C++网络教程</font></span></a></p>
</td>
</tr>
</table>
</center>
</div>
<p align="center"><b><font color="#FF3333">7.2文档视结构程序实例</font></b></p>
<p><font > 下面,我们以一个简单的文本编辑器为例,说明文档/视结构的原理及应用。由于我们重在讨论文档/视结构而不是编辑器的实现,因此这个编辑器设计的非常简单:用户只能逐行输入字符,以回车结束一行并换行,不支持字符的删除和插入,也没有光标指示当前编辑位置。另外,用户可以选择编辑器显示文本时所使用的字体。</font></p>
<p align="center"><img src="T7_4.gif"
alt="T7_4.tif (297712 bytes)" width="508" height="388"></p>
<p align="center"><font >图7-4</font></p>
<p><font > 首先,使用AppWizard生成编辑器程序的框架:在New对话框的Project Name编辑框中输入项目名为Editor。在AppWizard的第一步选择Single
document ,这将创建一个SDI应用程序。AppWizard第二和第三步选项使用缺省值。在AppWizard Step 4 of
6对话框中,如图7-4所示,细心的读者或许会注意到在这一页里,有一个Advanced按钮,以前没有提到过。现在揿击该按钮,弹出Advanced
Option对话框,如图7-5所示。Advanced Option对话框是用来设置文档视结构和主框架窗口的一些属性的。</font></p>
<p align="center"><img src="T7_5.gif"
alt="T7_5.tif (216970 bytes)" width="439" height="466"></p>
<p align="center"><font >图7-5</font></p>
<p><font > 该对话框提供两个标签页,一页是Document Template String(文档模板字符串,有关文档模板字符串,我们还将在后面作详细介绍),用于设置文档视结构的一些属性。它包括以下几个编辑框:</font></p>
<p><font > File Extension:指定应用程序创建的文档所用的文件名后缀。输入后缀名txt(不需要·号。),表明Editor使用文本文件的后缀名TXT。</font></p>
<p><font > File ID:用于在Windows95的注册数据库中标识应用程序的文档类型。</font></p>
<p><font > MainFrame Caption:主框架窗口使用得标题,缺省情况下与项目名相一致,你当然可以将它改为任何你喜欢的名字,如Editor
for Windows等。</font></p>
<p><font > Doc Type name:文档类型名,指定与一个从CDocument派生的文档类相关的文档类型名。</font></p>
<p><font > Filter Name:用作“打开文件”、“保存文件”对话框中的过滤器。当你在File Extension中输入后缀名是,Visual
Studio会自动给你生成一个过滤器:Editor Files(*.txt)。这样,当你在Open File对话框中选择Editor
Files(*.txt)时,只有以txt为后缀名的文件名显示在文件名列表中。</font></p>
<p><font > File new name(short name):用于指定在new对话框中使用的文档名。当应用程序支持多种文档类型时,选择File-New菜单项会弹出一个对话框,列出应用程序所支持的所有文档类型,供用户选择。选择一种文档类型后,自动创建相应类型的文档。这里我们只支持编辑器这一种文档类型,故使用缺省值。</font></p>
<p><font > File Type name(long name):用于指定当应用程序作为OLE Automation服务器时使用的文档类型名。使用缺省值。
</font></p>
<p><font > 另一页是Window Styles,用于设置主框架窗口的一些属性,包括框架窗口是否使用最大化按钮、最小化按钮,窗口启动时是否最大化或最小化等。这里我们使用缺省值,不需要作任何修改。</font></p>
<p><font > 按OK按钮,关闭Advanced Option对话框。</font></p>
<p><font > AppWizard后面的几页对话框都使用缺省值。创建完Editor框架程序后,Visual Studio自动打开Editor工程。现在要修改Editor框架程序,往程序中添加代码,实现编辑器功能。</font></p>
<p><font color="#3973DE" >7.2.1 文档/视结构中的主要类</font></p>
<p><font > 在Editor框架程序中,与文档视结构相关的类有CEditorApp、CMainFrame、CEditorView和CEditorDoc,它们分别是应用程序类CWinApp、框架窗口类CFrameWnd、视图类CView和文档类CDocument的派生类。</font></p>
<p><font color="#3973DE" >应用程序对象</font></p>
<p><font > 其中,应用程序类负责一个且唯一的一个应用程序对象的创建、初始化、运行和退出清理过程。如果在AppWizard生成框架时指定使用单文档或多文档,AppWizard会自动将File菜单下的New、Open和Printer
Setup(打印机设置)自动映射到CWinApp的OnFileNew、OnFileOpen、OnFilePrintSetup成员函数,让CWinApp来处理以上这些消息。如清单7.1,浏览CEditorApp类的定义文件有关消息映射的代码。</font></p>
<p><font >清单7.1 CEditorApp的消息映射</font></p>
<p><font >BEGIN_MESSAGE_MAP(CEditorApp, CWinApp)</font></p>
<p><font >//{{AFX_MSG_MAP(CEditorApp)</font></p>
<p><font >ON_COMMAND(ID_APP_ABOUT, OnAppAbout)</font></p>
<p><font >// NOTE - the ClassWizard will add and
remove mapping macros here.</font></p>
<p><font >// DO NOT EDIT what you see in these
blocks of generated code!</font></p>
<p><font >//}}AFX_MSG_MAP</font></p>
<p><font >// Standard file based document
commands</font></p>
<p><font >ON_COMMAND(ID_FILE_NEW,
CWinApp::OnFileNew)</font></p>
<p><font >ON_COMMAND(ID_FILE_OPEN,
CWinApp::OnFileOpen)</font></p>
<p><font >// Standard print setup command</font></p>
<p><font >ON_COMMAND(ID_FILE_PRINT_SETUP,
CWinApp::OnFilePrintSetup)</font></p>
<p><font >END_MESSAGE_MAP()</font></p>
<p><font > 这表明,框架已经给我们生成了有关新建文档、打开文档以及打印设置的标准代码,我们不必再去做这些重复的工作了。那么,当我们新建或打开一个文档时,应用程序怎么知道要创建什么样的文档以及创建什么样的视图、框架窗口来显示该文档的呢?在文档/视结构中,应用程序通过为应用程序所支持的每一种文档创建一个文档模板,来创建和管理所有的文档类型并为它们生成相应的视图和框架窗口。</font></p>
<p><font color="#3973DE" >文档模板</font></p>
<p><font > 文档模板负责创建文档、视图和框架窗口。一个应用程序对象可以管理一个或多个文档模板,每个文档模板用于创建和管理一个或多个同种类型的文档(这取决于应用程序是单文档SDI程序还是多文档MDI程序)。那些支持多种文档类型(如电子表格和文本)的应用程序,有多种文档模板对象。应用程序中的每一种文档,都必需有一种文档模板和它相对应。比如,如果应用程序既支持绘图又支持文本编辑,就需要一种一种绘图文档模板和文本编辑模板。在下一章里,我们举了一个这样的例子,来说明多种文档模板的实现技术。</font></p>
<p><font > MFC提供了一个文档模板类CDocTemplate支持文档模板。文档模板类是一个抽象的基类,它定义了文档模板的基本处理函数接口。由于它是一个抽象基类,因此不能直接用它来定义对象而必需用它的派生类。对一个单文档界面程序,使用CSingleDocTemplate(单文档模板类),而对于一个多文档界面程序,使用CMultipleDocTemplate。</font></p>
<p><font > 文档模板定义了文档、视图和框架窗口这三个类的关系。通过文档模板,我们可以知道在创建或打开一个文档时,需要用什么样的视图、框架窗口来显示它。这是因为文档模板保存了文档和对应的视图和框架窗口的CRuntimeClass对象的指针。此外,文档模板还保存了所支持的全部文档类的信息,包括这些文档的文件扩展名信息、文档在框架窗口中的名字、代表文档的图标等信息。</font></p>
<div align="center"><center><table border="2"
cellpadding="2" cellspacing="0" width="100%"
bgcolor="#ACE4FF">
<tr>
<td width="100%"><font >提示:每个从CObject派生的类都与一个CRuntimeClass结构相关联。通过这个结构,你可以在程序运行时刻获得关于一个对象和它的基类的信息。在函数参数需要作附加类型检查时,这种运行时刻判别对象类型的能力是非常重要的。C++本身并不支持运行时刻类信息。CRuntimeClass结构包含一个以\0结尾的字符串类名、整型的该类对象大小、基类的运行时刻信息等。</font></td>
</tr>
</table>
</center></div>
<p><font > 一般在应用程序的InitInstance成员函数实现中创建一个或多个文档模板,如清单7.2。</font></p>
<p><font >清单7.2 CEditorApp的InitInstance成员函数定义</font></p>
<p><font >BOOL CEditorApp::InitInstance()</font></p>
<p><font >{</font></p>
<p><font >//标准的初始化代码</font></p>
<p><font >//......</font></p>
<p><font >// Register the application's document
templates. Document templates</font></p>
<p><font >// serve as the connection between
documents, frame windows and views.</font></p>
<p><font >CSingleDocTemplate* pDocTemplate;</font></p>
<p><font >pDocTemplate = new CSingleDocTemplate(</font></p>
<p><font >IDR_MAINFRAME,</font></p>
<p><font >RUNTIME_CLASS(CEditorDoc),</font></p>
<p><font >RUNTIME_CLASS(CMainFrame), // main SDI
frame window</font></p>
<p><font >RUNTIME_CLASS(CEditorView));</font></p>
<p><font >AddDocTemplate(pDocTemplate);</font></p>
<p><font >//其他的初始化代码和主框架窗口显示过程</font></p>
<p><font >//......</font></p>
<p><font >// Enable DDE Execute open</font></p>
<p><font >EnableShellOpen();</font></p>
<p><font >RegisterShellFileTypes(TRUE);</font></p>
<p><font >// Parse command line for standard
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -