📄 chap08.html
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第6章 文档/视结构</TITLE>
</HEAD>
<BODY>
<FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc425698198">第八章</FONT><FONT FACE="Arial" SIZE=5> </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>文档</FONT><FONT FACE="Arial" SIZE=5>/</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>视结构</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构是在</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>开发基于文档的应用程序的基本框架,在这个框架中,数据的维护及其显示是分别由两个不同,但又彼此紧密相关的对象</FONT><FONT SIZE=3>——</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文档和视负责的。文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构在很多场合与传统的编程方式相比要更有利于这一类应用程序的编写。</P>
<P ALIGN="JUSTIFY">本章介绍</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构。这是一个相对比较复杂的课题,所涉及的内容也比较广泛,具有来说有以下一些:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构以及这种结构以编程带来的便利之处</LI></P>
<P ALIGN="JUSTIFY"><LI>是否使用文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的考虑</LI></P>
<P ALIGN="JUSTIFY"><LI>使用</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建基于文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的框架应用程序</LI></P>
<P ALIGN="JUSTIFY"><LI>使用文档类<BR>
在文档类的成员变量中保存文档数据<BR>
串行化文档数据<BR>
在文档类中处理命令消息</LI></P>
<P ALIGN="JUSTIFY"><LI>使用视类<BR>
从文档类中获取数据<BR>
在视中显示数据<BR>
处理用户输入的信息<BR>
更新文档的所有视<BR>
视的滚动和缩放</LI></P>
<P ALIGN="JUSTIFY"><LI>多视与多文档</LI></P>
<P ALIGN="JUSTIFY"><LI>打印和打印预览</LI></P></UL>
<P ALIGN="JUST 的显示及与用户的交互两者分离开来,会使程序的结构更加清晰,更易于维护。而且,这种方式为我们编写某些应用程序提供了便利,在这些应用程序中,同一文档对应着多个视,这些视可以是同一视类的多个实例对象,也可以是多个不同视类的实例对象。在一些应用程序中,如果不将文档的数据与其显示和用户交互相分离,其实现将是非常之困难,或者说,是几乎无法实现的。文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构非常适合于编写这些应用程序。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><A NAME="_954034256"></A><IMG SRC="Image333.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image333.gif" WIDTH=432 HEIGHT=248></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>文档的创建</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image334.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image334.gif" WIDTH=545 HEIGHT=351></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.3 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>框架窗口的创建</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><A NAME="_954037190"></A>文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构尽管有很多的优势,但是,在一些很特殊的情况下,我们仍有可能不需要或者说不应该使用文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image335.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image335.gif" WIDTH=310 HEIGHT=140></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>视的创建</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">最典型的一种情况是,如果我们需要移植一些过去编写的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序,而在这些程序中,数据的管理和显示是合在一起,要使用文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构来改写它们将会是一件消耗大量人力和物力的工作。对于这些应用程序,最有效的方法是不使用文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构。</P>
<P ALIGN="JUSTIFY">在某些情况下,我们既不使用文档,也不使用视,而是在框架窗口中管理和显示数据,这时,我们应该修改应用程序类的</FONT><FONT SIZE=3>InitInstance</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数,创建自己的框架窗口。这种方式需要的工作量最大,并且要对框架有相当深入的了解,然而,它提供了彻底避开文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构所带来的微小额外开销的方法。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">文档对象所产生的微小额外开销来源于文档类本身以及它的基类</FONT><FONT SIZE=3>CCmdTarget</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>CObject</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。并且,文档还需要额外的时间来创建文档对象、相关的视对象、框架窗口以及文档模板对象。</P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>使用文档对象所带来的额外开销是很微小的。因此,在绝大多数场合,我们都应该选择文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>视结构来编写基于文档的</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>应用程序,而没有必要去考虑因为这种额外开销所带来的性能问题。</LI></P></UL>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698200">第二节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>使用</FONT><FONT SIZE=4>AppWizard</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>创建框架应用程序</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">单击</FONT><FONT SIZE=3>Microsoft Developer Studio</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的菜单项</FONT><FONT SIZE=3>File|New...</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Project</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡中选择</FONT><FONT SIZE=3>MFC AppWizard(EXE)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并在</FONT><FONT SIZE=3>Project</FONT me</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类和</FONT><FONT SIZE=3>CChildFrame</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类外,</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所生成的类的名称是基于您所设定的工程名称的,而类的头文件和实现文件的文件名则是基于类名的。通常,我们只能为</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所生成的视类指定另外的基类。可以使用的基类通常包括</FONT><FONT SIZE=3>CEditView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CFormView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CListView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CRichEditView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CScrollView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CTreeView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>CView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。默认情况下,</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用</FONT><FONT SIZE=3>CView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>作为应用程序的视类的基类。事实上,其它的视类也都是</FONT><FONT SIZE=3>CView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的派生类。使用其它的视类方便的可以实现某些而不用我们编写额外的代码。关于这些视类的使用请参阅本章的</FONT><FONT SIZE=3> “8.4 CView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的派生类</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一节。</P>
<P ALIGN="JUSTIFY">单击</FONT><FONT SIZE=3>Finish</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将根据您在上面的步骤中所作的选择为应用程序生成所需的框架文件。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>Introduc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,我们在所有的步骤中均使用</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的默认设置。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">使用</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建单文档界面的应用程序和上面的过程几乎是完全一样的。主要的差别在于:</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在创建单文档界面的应用程序时,不生成</FONT><FONT SIZE=3>CChildFrame</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类,并且,单文档界面应用程序的</FONT><FONT SIZE=3>CMainFrame</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的基类为</FONT><FONT SIZE=3>CFrameWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,而多文档界面应用程序的</FONT><FONT SIZE=3>CMainFrame</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的基类为</FONT><FONT SIZE=3>CMDIFrameWnd</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -