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

深入浅出MFC第2版(PDF格式)-第137章

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




                       。。。 

                       loadArchive。Close(); 

                       ReleaseFile(pFile; FALSE); 

                    } 



             operator》 



                   CArchive 针对许多C++ 数据类型、Windows 数据类型以及CObject 衍生类别,定义 



                   operator》 多载运算子: 



                    // in AFX。H 

                    class CArchive 

                    { 

                   public: 

                    // Flag values 

                           enum Mode { store = 0; load = 1; bNoFlushOnDelete = 2; bNoByteSwap = 4 }; 

                           CArchive(CFile* pFile; UINT nMode; int nBufSize = 4096; void* lpBuf = NULL); 

                           ~CArchive(); 



                    // Attributes 

                           BOOL IsLoading() const; 

                           BOOL IsStoring() const; 

                           BOOL IsByteSwapping() const; 

                           BOOL IsBufferEmpty() const; 



                           CFile* GetFile() const; 



532 


…………………………………………………………Page 595……………………………………………………………

                                                  第8章    Document…View  深入探討 



        UINT GetObjectSchema(); // only valid when reading a CObject* 

        void SetObjectSchema(UINT nSchema); 



        // pointer to document being serialized …must set to serialize 

        //  COleClientItems in a document! 

        CDocument* m_pDocument; 



// Operations 

        UINT Read(void* lpBuf; UINT nMax); 

        void Write(const void* lpBuf; UINT nMax); 

        void Flush(); 

        void Close(); 

        void Abort();   // close and shutdown without exceptions 



        // reading and writing strings 

        void WriteString(LPCTSTR lpsz); 

        LPTSTR ReadString(LPTSTR lpsz; UINT nMax); 

        BOOL ReadString(CString& rString); 



public: 

        // Object I/O is pointer based to avoid added construction overhead。 

        // Use the Serialize member function directly for embedded objects。 

        friend CArchive& AFXAPI operator(CArchive& ar; CObject*& pOb); 

        friend CArchive& AFXAPI operator》》(CArchive& ar; const CObject*& pOb); 



        // insertion operations 

        CArchive& operator(unsigned& u); 



                             // object read/write 

                             CObject* ReadObject(const CRuntimeClass* pClass); 

                             void WriteObject(const CObject* pOb); 

                             // advanced object mapping (used for forced references) 

                             void MapObject(const CObject* pOb); 



                             // advanced versioning support 

                             void WriteClass(const CRuntimeClass* pClassRef); 

                             CRuntimeClass* ReadClass(const CRuntimeClass* pClassRefRequested = NULL; 

                                     UINT* pSchema = NULL; DWORD* pObTag = NULL); 

                             void SerializeClass(const CRuntimeClass* pClassRef); 

                             。。。 

                     protected: 

                             // array/map for CObject* and CRuntimeClass* load/store 

                             UINT m_nMapCount; 

                             union 

                             { 

                                     CPtrArray* m_pLoadArray; 

                                     CMapPtrToPtr* m_pStoreMap; 

                             }; 

                             // map to keep track of mismatched schemas 

                             CMapPtrToPtr* m_pSchemaMap; 

                             。。。 

                     }; 



                    这些多载运算子均定义于AFX。INL 文件中。另有些函数可能你会觉得眼熟,没错,它 



                    们在稍早的「台面下的Serialize 奥秘」中已经出现过了,它们是ReadObject 、WriteObject  、 



                    ReadClass 、WriteClass。 



                    各种类型的operator》》 和operator》(CArchive& ar; const CObject*& pOb) 

         { pOb = ar。ReadObject(NULL); return ar; } 



其中CArchive::WriteObject 先把类别的CRuntimeClass 信息写出, 再调用类别的 



Serialize  函数。CArchive::ReadObject  的行为类似,先把类别的CRuntimeClass 信息读入, 



再调用类别的Serialize  函数。Serialize 是CObject 的虚拟函数,因此你必须确定你的 



类别改写的Serialize  函数的回返值和参数类型都符合CObject 中的声明:传回值为 



void ,唯一一个参数为CArchive&。 



  注意:CString、CRect、CSize、CPoint 并不衍生自CObject,但它们也可以直接使用针 



  对CArchive 的》 运算子,因为它们自己设计了一套: 



 // in AFX。H 

 class CString 

 { 

     friend CArchive& AFXAPI operator(CArchive& ar; CString& string); 

     。。。 

 }; 



 // in AFXWIN。H 

 // Serialization 

 CArchive& AFXAPI operator(CArchive& ar; RECT& rect); 



一个类别如果希望有Serialization 机制,它的第二要件就是使用SERIAL 宏。这个巨 



集包容DYNCREATE 宏,并且在类别的声明之中加上: 



friend CArchive& AFXAPI operator》》(CArchive& ar; class_name* &pOb); 



在类别的实作档中加上: 



 CArchive& AFXAPI operator》》(CArchive& ar; class_name* &pOb)  

         { pOb = (class_name*) ar。ReadObject(RUNTIME_CLASS(class_name));  

                 return ar; }  



                                                                                      535 


…………………………………………………………Page 598……………………………………………………………

                 第篇    深入  MFC  程式設計 


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