📄 chap08.html
字号:
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">由</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>生成的应用程序框架已经是一个可以运行的完整的应用程序了。单击菜单项</FONT><FONT SIZE=3>Build|Execute Introduc.exe</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或按快捷键</FONT><FONT SIZE=3>Ctrl+F5</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>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所生成的框架应用程序。该应用程序运行结果如图</FONT><FONT SIZE=3>8.5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image336.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image336.gif" WIDTH=397 HEIGHT=286></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.5 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>使用</FONT><FONT SIZE=1>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>创建的框架应用程序</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><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>为我们完成了这些既枯燥乏味又容易出错的工作,从而将程序员从大量的重复性劳动中解放出来,使他们可以有时间去从事更有意义的功能,把更多的精力放到完成应用程序所具有的特定的功能上。</P>
<P ALIGN="JUSTIFY">另外,我们还会发现,上面的框架应用程序还可以响应如</FONT><FONT SIZE=3> “</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>保存</FONT><FONT SIZE=3>” </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">可以使用</FONT><FONT SIZE=3>Workspace</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口的</FONT><FONT SIZE=3>ClassView</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>Introduc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的视类和文档类中所重载的基类函数。在后面的章节中,我们需要修改这些重载函数和添加新的成员函数来为特定的应用程序实现所需的功能。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698201">第三节</FONT><FONT SIZE=4> </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>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构中,文档的任务通常是对数据进行管理和维护。我们通常将数据保存在文档类的成员变量中。视可以直接或间接的访问文档类中的这些成员变量,并通过这种方式来显示和更新数据。关于使用文档类的成员变量来保存数据的详细介绍请参阅</FONT><FONT SIZE=3> “8.3.2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>把数据保存到成员变量中</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3> “8.3.3 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用集合类管理数据</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>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构相关的文档中,我们称这个过程叫串行化</FONT><FONT SIZE=3>(serialize)</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> “8.3.4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>数据的串行化</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一节中讲述了实现一般的串行化过程的方法和步骤。对象的串行化需要考虑一些额外的问题,这在</FONT><FONT SIZE=3> “8.3.5 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>串行化对象</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中讲述。文档类还可以处理命令消息,这里所谓的命令消息是指来自如菜单、工具栏按钮和加速键的</FONT><FONT SIZE=3>WM_COMMAND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>通知消息。与</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息和控件通知消息不同,命令消息可以被多种对象处理,这些对象除了窗口和视外,还可以是文档、文档模板或应用程序本身。除了</FONT><FONT SIZE=3>WM_COMMAND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>外,文档不能处理其它的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息。</P>
</FONT><FONT FACE="Arial"><P>8.3.1 </FONT><FONT FACE="黑体" LANG="ZH-CN">概述</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">所有的文档类都以</FONT><FONT SIZE=3>CDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类为其基类。</FONT><FONT SIZE=3>CDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类提供了文档类所需要的最基本的功能实现。更重要的是,</FONT><FONT SIZE=3>CDocument</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>CDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类派生自己的文档类所需的典型步骤为:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为每一个文档类型从</FONT><FONT SIZE=3>CDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当然也可以是其它</FONT><FONT SIZE=3>CDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的派生类</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生一个相应的文档类。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.	</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>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>重载</FONT><FONT SIZE=3>Serialize</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>CDocument</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>OnNewDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>Serialize</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等。但是,</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在这些重载函数中只是简单地调用基类的相应函数,您需要根据自己的应用程序的需要来修改它们。</P>
<P ALIGN="CENTER"><IMG SRC="Image337.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image337.gif" WIDTH=390 HEIGHT=280></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.6 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>示例程序</FONT><FONT SIZE=1>Example</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>的运行结果</P>
</FONT><FONT FACE="Arial"><P>8.3.2 </FONT><FONT FACE="黑体" LANG="ZH-CN">把文档数据保存到成员变量中</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>(</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>主要是视</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的相互搭配使用。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">下面我们来看一个简单的例子。该示例程序运行时如图</FONT><FONT SIZE=3>8.6</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</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>Example</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>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的多文档界面应用程序框架,请参阅</FONT><FONT SIZE=3> “8.2.1</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>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的应用程序所需的步骤</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一节中的讲述。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>Workspace</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口的</FONT><FONT SIZE=3>ClassView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡中展开</FONT><FONT SIZE=3>Example classes</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>Example</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序生成的所有类。右击</FONT><FONT SIZE=3>CExampleDoc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类,单击</FONT><FONT SIZE=3>Add Member Variable...</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Variable Type</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>框中输入成员变量的类型</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>Variable Declaration</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>框中输入成员变量名</FONT><FONT SIZE=3>m_str</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。由于我们希望其它类的对象可以访问该成员变量,因此在</FONT><FONT SIZE=3>Access</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>框中选择其访问类型为</FONT><FONT SIZE=3>Public</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。单击</FONT><FONT SIZE=3> “OK”</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将该成员变量的定义添加类的定义中。</P>
<P ALIGN="JUSTIFY">再按照与上面的过程相同的方法,在类</FONT><FONT SIZE=3>CExampleDoc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中添加类型为</FONT><FONT SIZE=3>LOGFONT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的公有成员变量</FONT><FONT SIZE=3>m_lf</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">我们也可以手动地将成员变量添加到类</FONT><FONT SIZE=3>CExampleDoc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义中。如下面的步骤所示:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2'.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>Workspace</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口中的</FONT><FONT SIZE=3>FileView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡中展开</FONT><FONT SIZE=3>Example files|Header Files</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。双击</FONT><FONT SIZE=3>ExampleDoc.h</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>ExampleDoc.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,这个文件包括了</FONT><FONT SIZE=3>Example</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中的文档类</FONT><FONT SIZE=3>CExampleDoc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义。</P>
<P ALIGN="JUSTIFY">在其中的</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>// Attributes</P>
<P>public:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">之后手工地输入</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>CString m_str;</P>
<P>LOGFONT m_lf;</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">您也许已经发现,在类</FONT><FONT SIZE=3>CExampleDoc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义中包括多个</FONT><FONT SIZE=3>public</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块。事实上,您可以把这些定义都放到同一个</FONT><FONT SIZE=3>public</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中,在定义中包括多个</FONT><FONT SIZE=3>public</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块只是为了区别开不同用途的公有成员。例如,在上面所示的代码中,我们将成员变量</FONT><FONT SIZE=3>m_str</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义放到</FONT><FONT SIZE=3>Attributes</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块内;而如果您是使用</FONT><FONT SIZE=3>Add Member Variable...</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>Implementation</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中。这只是为了便于程序的阅读和维护,对于编译器而言,您将公有成员的定义放到哪一个</FONT><FONT SIZE=3>public</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中其结果都是一样的,对于私有成员和保护成员也是一样。</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为了测试该程序中,我们在</FONT><FONT SIZE=3>CExampleDoc</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>OnNewDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员变量中为公有成员</FONT><FONT SIZE=3>m_str</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>欢迎使用本程序</FONT><FONT SIZE=3>!”</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并弹出一个字体对话框让用户为该字符串选定字体。方法是使用下面的代码替换</FONT><FONT SIZE=3>OnNewDocument</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的实现代码中的</FONT><FONT SIZE=3>// TODO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注释:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>m_str="您好, 欢迎使用本程序!";</P>
<P>CFontDialog dlg;</P>
<P>dlg.GetCurrentFont(&m_lf);</P>
<P>// 将用户选定的字体信息填充到LOGFONT类型的结构m_lf中,以供视类使用</P>
<P>if(dlg.DoModal()==IDOK)</P>
<P>	dlg.GetCurrentFont(&m_lf);</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">4.	</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>Example</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序的视类</FONT><FONT SIZE=3>CExampleView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数添加一些代码,以将文档类中的</FONT><FONT SIZE=3>m_str</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员变量的内容显示到视的框架窗口中。关于视类的内容是在本章的</FONT><FONT SIZE=3> “8.4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>生成视</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一节中讲述的。在本节,为了使应用程序完整并且能够运行,以反映我们对文档类所进行的一些操作,书中给出一些用于视类的代码,并且,为了使章节的行文连贯和有重点,我们并不详细的讲解这些代码。如果您还不是很了解视类的话,大可不必去在意这些代码究竟都是怎样工作的,以及为什么要这样书写这些代码,把本书继续看下去,这些代码都不会成其为问题。但若您现在很想了解这些内容,那也不妨跳过去浏览一下</FONT><FONT SIZE=3> “8.4 </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>CExampleView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>// 获取当前客户区的大小</P>
<P>CRect rectClient;</P>
<P>GetClientRect(rectClient);</P>
<P>CSize sizeClient=rectClient.Size();</P>
<P>// 从文件中读取数据</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -