⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap08.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 5 页
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.8 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>打开文档时的串行化过程</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">图</FONT><FONT SIZE=3>8.8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>描述了打开文档时的串行化过程。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">由图</FONT><FONT SIZE=3>8.7</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和图</FONT><FONT SIZE=3>8.8</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>Serialize</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>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的参数,这是一个与所打开的文件相关联的对象。一般情况下,我们总是使用</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象来保存和打开文档。</P>
<P ALIGN="JUSTIFY">一个</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象和一个标准的</FONT><FONT SIZE=3>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>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>析取运算符</FONT><FONT SIZE=3>&gt;&gt;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和插入运算符</FONT><FONT SIZE=3>&lt;&lt;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将一个对象串行化到与</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的存储介质中,两者最大的差别在于标准的</FONT><FONT SIZE=3>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>ASCII</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>字符串,而</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象用来存取非冗余的二进制对象,这种格式更为有效,并且应用也更加广泛。</P>
<P ALIGN="JUSTIFY">在创建</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象之前必须创建一个</FONT><FONT SIZE=3>CFile</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,并将该</FONT><FONT SIZE=3>CFile</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象与</FONT><FONT SIZE=3>CArchive</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>成员函数之前完成,我们无需再做。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象是单向的,也就是说,同一个</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象只能用于保存或读取两者之一,不能通过同一个</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象既进行文档的保存,又进行文档的读取。在框架创建</FONT><FONT SIZE=3>CArchive</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>打开</FONT><FONT SIZE=3>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来设置了</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的类型,我们可以使用</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的成员函数</FONT><FONT SIZE=3>IsStoring</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来检索当前</FONT><FONT SIZE=3>CArchive</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的类型,从而得知用户所期望的操作是保存还是读取,从而执行不同的操作。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">下面,我们为示例程序</FONT><FONT SIZE=3>Example</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="CENTER"><IMG SRC="Image340.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image340.gif" WIDTH=111 HEIGHT=85></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.9 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>示例程序</FONT><FONT SIZE=1>Example</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>的</FONT><FONT SIZE=1> “</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>编辑</FONT><FONT SIZE=1>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>菜单</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.&#9;</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>ResourceView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项卡,展开</FONT><FONT SIZE=3>Example resources|Menu</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,双击</FONT><FONT SIZE=3>IDR_EXAMPLTYPE</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>和</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>8.9</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并设置新添加的菜单项的</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>ID_EDIT_CHANGETEXT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>ID_EDIT_CHANGEFONT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为示例程序添加如图</FONT><FONT SIZE=3>8.10</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框。然后使用</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为对话框生成</FONT><FONT SIZE=3>CDialog</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的派生类</FONT><FONT SIZE=3>CInputDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并为其中的</FONT><FONT SIZE=3>Edit Box</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>其</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>IDC_EDIT1)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加相关联的成员变量</FONT><FONT SIZE=3>m_input</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,其类型为</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="CENTER"><IMG SRC="Image341.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image341.gif" WIDTH=183 HEIGHT=74></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>8.10 “</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>改变显示文本</FONT><FONT SIZE=1>” </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>对话框</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在类中添加公有成员函数</FONT><FONT SIZE=3>GetInput</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,其类型为</FONT><FONT SIZE=3>CString</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,参数为空,定义如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>CString CInputDlg::GetInput()</P>
<P>{</P>
<P>&#9;if (DoModal()==IDOK)</P>
<P>&#9;&#9;return m_input;</P>
<P>&#9;else</P>
<P>&#9;&#9;return "";</P>
<P>}</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">4.&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用</FONT><FONT SIZE=3>ClassWizard</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> “</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编辑</FONT><FONT SIZE=3>|</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>改变显示文本</FONT><FONT SIZE=3>” (ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>ID_EDIT_CHANGETEXT)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加处理函数</FONT><FONT SIZE=3>OnEditChangeText</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,其代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CExampleDoc::OnEditChangeText() </P>
<P>{</P>
<P>&#9;CInputDlg inputDlg;</P>
<P>&#9;CString str=inputDlg.GetInput();</P>
<P>&#9;if (str!="")</P>
<P>&#9;{</P>
<P>&#9;&#9;m_str=str;</P>
<P>&#9;&#9;UpdateAllViews(NULL);</P>
<P>&#9;}</P>
<P>}</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>” (ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>ID_EDIT_CHANGEFONT)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加处理函数</FONT><FONT SIZE=3>OnEditChangeFont</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,其代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CExampleDoc::OnEditFont() </P>
<P>{</P>
<P>&#9;CFontDialog dlg;</P>
<P>&#9;dlg.GetCurrentFont(&amp;m_lf);</P>
<P>&#9;if(dlg.DoModal()==IDOK)</P>
<P>&#9;{</P>
<P>&#9;&#9;dlg.GetCurrentFont(&amp;m_lf);</P>
<P>&#9;&#9;UpdateAllViews(NULL);</P>
<P>&#9;}</P>
<P>}</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>改变字体</FONT><FONT SIZE=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>Serialize</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数来完成串行化。重载后的</FONT><FONT SIZE=3>Serialize</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CExampleDoc::Serialize(CArchive&amp; ar)</P>
<P>{</P>
<P>&#9;if (ar.IsStoring())</P>
<P>&#9;{</P>
<P>&#9;&#9;ar&lt;&lt;m_str;</P>
<P>&#9;&#9;ar&lt;&lt;m_lf.lfHeight</P>
<P>&#9;&#9;  &lt;&lt;m_lf.lfW

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -