友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第52章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




   o  提供用于操作文档数据的接口。  

   o  参与写文件和读文件。通过串行化功能,文档类可以将数据从文件中读出或者写入。  

   o  参与打印输出。这个任务主要通过视图类访问文档进行。  

   o  处理跟文档有关的命令消息。这些命令包括菜单项、工具栏按钮或快捷键生成的命令。 

    默认情况下,文档类使用序列化处理“文件”菜单的“保存”和“另存为”命令。还 

    可以为其他跟文档相关的自定义命令添加相应的处理函数。  

   为了完成上述的任务,文档类的基类 CDocument 提供了下列一些成员函数。  



   1.处理文档数据与文件相关的操作的函数  



   (1)GetTitle()和 SetTitle()  

   这两个函数作为一组,前者用于获取文档的标题,后者用于设置文档标题。原型为:  


…………………………………………………………Page 186……………………………………………………………

                                                                                            第 8 章    文件操作  



      const CString& GetTitle( ) const;  



     virtual void SetTitle(  



           LPCTSTR lpszTitle    



      );  



      (2 )GetPathName()和 SetPathName()  

      这两个函数用于处理文档保存的路径 。前者用于获得文档保存路径的字符串,后者设置 

该路径。原型为:  



      const CString& GetPathName( ) const;  



     virtual void SetPathName(  



           LPCTSTR lpszPathName;  



           BOOL bAddToMRU = TRUE    



      );  



      参数 bAddToMRU 用于确定是否将路径添加到最近打开的文档列表中。  



      2 .GetDocTemplate()  



      该函数用于获得文档模板对象的指针。原型为:  



      CDocTemplate* GetDocTemplate( ) const;  



      3 .处理文档类和视图类的关系的函数  



      (1)AddView()  

      该函数用于向与文档相关联的视图列表中添加指定的视图。原型为:  



     void AddView(  



           CView* pView    



      );  



      参数 pView 指向需要添加的视图对象。  



      (2 )RemoveView()  

      该函数用于从文档类的视图列表中删除指定视图。原型为:  



     void RemoveView(  



           CView* pView    



      );  



      参数 pView 指向需要删除的视图对象。  



      (3 )UpdateAllView()  

      该函数用于通知所有视图进行重绘。一般情况下,当文档数据被修改后,应当调用这个 

函数使得所有跟文档关联的视图进行重绘,以显示最新的内容。原型为:  



     void UpdateAllViews(  



           CView* pSender;  



           LPARAM lHint = 0L;  



           CObject* pHint = NULL    



      );  



                                                                                                        ·175 ·  


…………………………………………………………Page 187……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     o  参数 pSender :用于指定修改文档的视图类的指针。  

     o  参数 lHint 和 pHint :存有修改的一些参数。  



     4 .虚函数  



     下面介绍的函数是 CDocument 类提供的虚函数,程序的 CDocument 派生类通过重载这 

些函数提供程序自定义的功能。  



     (1)OnNewDocument()  

     该虚函数用于在建立文档时被 MFC 框架调用。原型为:  



     virtual BOOL OnNewDocument( );  



     o  函数返回值:函数是否成功的标志。  



     (2 )OnOpenDocument ()  

     该虚函数用于在打开文档时被 MFC 框架调用。原型为:  



     virtual BOOL OnOpenDocument(  



           LPCTSTR lpszPathName    



     );  



     o  参数 lpszPathName :用于获得将要打开文档的路径。  

     o  函数返回值:函数是否成功的标志。  



     (3 )OnSaveDocument ()  

     该虚函数用于在保存文档时被 MFC 框架调用。原型为:  



     virtual BOOL OnSaveDocument(  



           LPCTSTR lpszPathName    



     );  



     o  参数 lpszPathName :用于获得将要保存文档的路径。  

     o  函数返回值:函数是否成功的标志。  



     (4 )OnCloseDocument()  

     该虚函数用于在关闭文档时被 MFC 框架调用。原型为:  



     virtual void OnCloseDocument( );  



     (5 )CanCloseFrame()  

     该虚函数用于确认文档的框架窗口是否允许被关闭,比如文档未保存时,在框架窗口要 

被关闭时提示是否保存文档。原型为:  



     virtual BOOL CanCloseFrame(  



           CFrameWnd* pFrame    



     );  



     o  参数 pFrame :该文档的框架窗口类的指针。  

     o  函数返回值:函数是否成功的标志。  



     (6 )DeleteContents()  

     该虚函数用于在未销毁文档对象时删除文档数据。原型为:  



     virtual void DeleteContents( );  



 ·176 ·  


…………………………………………………………Page 188……………………………………………………………

                                                                      第 8 章    文件操作  



    (7 )ReleaseFile()  

    该虚函数用于释放文件以允许其他应用程序使用。原型为:  



    virtual void ReleaseFile(  



          CFile* pFile;  



          BOOL bAbort    



    );  



    o  参数 pFile :要释放的 CFile 对象。  

    o  参数 bAbort :指定用什么方法释放对象,若取值为 TRUE,则用 CFile::Abort(),反之 

      用 CFile::Close() 。  



    (8)SaveModified()  

    该虚函数用于查询文档的修改状态并存储修改的文档。原型为:  



    virtual BOOL SaveModified( );  



    o  函数返回值:函数是否成功的标志。  



8。1。2    Serialize()函数  



    在  8。1。1  节中介绍了文档的主要结构,本小节将讲述如何创建和使用文档与磁盘文件之 

间的串行化读写通道,即 Serialize()函数。  



    1.串行化的基本概念  



    串行化在面向对象程序设计领域中的基本概念是指对象可以被持续,即当程序退出时, 

它们可以被保存在磁盘中,而当程序重新运行时又可以从磁盘中读取恢复。对象的这种保存 

和恢复的过程就称为“串行化 ”。在 MFC                  中,对象串行化的成员函数称为 Serialize()成员函 

数。这个函数提供了将类的数据进行存盘和读取的功能。  

    在  MFC   中,串行化过程是顺序的,即与文档相关的所有对象只能在某个单独的文件中 

                                            MFC 的文档类中就只提供了顺序保存和读写 

进行顺序的读或写,而并不能进行随机的访问。 

文档数据的功能。  



    2 .将类串行化  



    将类串行化需要进行下列几个步骤:  



    (1)从 CObject 派生  

    在  CObject  类中定义了基本的序列化协议和功能,需要串行化的类必须直接或间接地从 

CObject 类派生,从而获得对 CObject 的序列化协议及功能的访问权限。  



    (2 )添加 DECLARE_SERIAL()宏  

    设置好基类后,在类的声明中添加一个 DECLARE_SERIAL()宏,具体代码如下:  



    class CSample : public CObject    // 由 CObject 派生  



    {  



    public:  



         ……//其他成员变量和成员函数的定义  



                                                                               ·177 ·  


…………………………………………………………Page 189……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         DECLARE_SERIAL(CSample)      //声明串行化,参数为该类的类名  



          ……//其他成员变量和成员函数的定义  



     };  



     (3 )添加 IMPLEMENT_SERIAL()宏  

     在类的实现文件中添加 IMPLEMENT_SERIAL()宏,具体代码如下:  



     IMPLEMENT_SERIAL(CSample; CObject; 0)     //该宏一般应包含在 Sample。cpp 文件中  



     IMPLEMENT_SERIAL()宏用于定义从 CObject 中派生可序列化类时所需的各种函数。在 

类的实现文件(。CPP) 中使用这个宏。该宏的前两个参数是类名和直接基类的名称。  

     该宏的第三个参数是架构编号。架构编号实质上是类对象的版本号,它使用大于或等于 

零的整数。MFC 序列化代码在将对象读取到内存时检查该架构编号 。如果磁盘上对象的架构 

编号与内存中类的架构编号不匹配,库将引发 CArchiveException 防止程序读取对象的不正确 

版本。  



     (4 )定义不带参数的构造函数  

     对象从磁盘上加载后, MFC                  通过    CreateObject() 函数自动重新创建这些对象。而 

CreateObject()函数创建对象时需要一个默认的构造函数。可将该构造函数声明为公共的、受 

保护的或私有的。在此之前,请确保它仅由串行化函数使用。  



     3 .编写 Serialize()函数  



     在 CObject 类中定义的 Serialize()成员函数,实际上是对捕获对象的当前状态所必需的数 

据进行串行化 。因此在为类做好串行化的准备后,再为类重载 CObject 的 Serialize()成员函数, 

就可以实现串行化的功能。例如 CSampleData 类中有如下的成员变量:  



     public:  



         CString m_strName;  



         int  m_nType;  



     实现 CSampleData 的序列化,就需要将这两个成员变量保存到磁盘中或者从磁盘中装入, 

于是将 CSampleData::Seri
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!