八宝书库 > 文学其他电子书 > 深入浅出MFC第2版(PDF格式) >

第106部分

深入浅出MFC第2版(PDF格式)-第106部分

小说: 深入浅出MFC第2版(PDF格式) 字数: 每页4000字

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




                                              。。。 

                                          } 

                                          。。。 

                                          return pClassRef; 

                                      } 



                                                                                                                                    519 



C 


…………………………………………………………Page 582……………………………………………………………

                  第篇    深入  MFC  程式設計 



                       CRuntimeClass* PASCAL CRuntimeClass::Load(CArchive& ar; 

                    B 

                               UINT* pwSchemaNum) // loads a runtime class description 

                       { 

                           WORD nLen; 

                           char szClassName'64'; 

                           CRuntimeClass* pClass; 



                                           本例读入 0001 

                           WORD wTemp; 

                           ar 》》 wTemp;  

                           *pwSchemaNum = wTemp; 

                                            本例读入 0007 

                           ar 》》 nLen; 

                                                                       本例读入 “CStroke” 

                           if (nLen 》= _countof(szClassName) || 

                               ar。Read(szClassName; nLen*sizeof(char)) != nLen*sizeof(char)) 

                           { 

                                   return NULL; 

                           } 

                           szClassName'nLen' = '0'; 



                           // search app specific classes 

                           AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); 

                           AfxLockGlobals(CRIT_RUNTIMECLASSLIST); 

                           for (pClass = pModuleState…》m_classList; pClass != NULL; 

                                pClass = pClass…》m_pNextClass) 

                           { 

                                   if (lstrcmpA(szClassName; pClass…》m_lpszClassName) == 0) 

                                   { 

                         检验整个 

                                           AfxUnlockGlobals (CRIT_RUNTIMECLASSLIST); 

                        「类别型录网」 

                                           return pClass; 

                                   } 

                           } 

                            。。。 

                       } 



520 


…………………………………………………………Page 583……………………………………………………………

                                                        第8章    Document…View  深入探討 



D 

   void CStroke::Serialize(CArchive& ar) 

    void CStroke::Serialize(CArchive& ar) 

    { 

     { 

       if (ar。IsStoring()) 

        if (ar。IsStoring()) 

       { 

        { 

           。。。 

            。。。 

       } 

        } 

       else 

        else 

       { 

        {                 本例读入 0002 

           WORD w; 

            WORD w; 

           ar 》》 w; 

            ar 》》 w; 

           m_nPenWidth = w; 

            m_nPenWidth = w; 

           m_pointArray。Serialize(ar); 

            m_pointArray。Serialize(ar); 

       } 

        } 

    } 

     } 



    void CDWordArray::Serialize(CArchive& ar) 

     { 

        CObject::Serialize(ar); 



        if (ar。IsStoring()) 

        { 

            。。。 

        } 

        else                                  本例读入 0002 

        { 

            DWORD nOldSize = ar。ReadCount (); 

            SetSize(nOldSize); 

            ar。Read (m_pData; m_nSize * sizeof(DWORD)); 

        } 

     } 

                              本例读入 00000019; 00000016; 00000019; 00000016 

                                   注意,别忘了,              使用的数组类别其实是 

                                                 Scribble 

                                                       ,这里的 

                                   CArray               CDWordArray  

                     只是为了方便解说。请看本章“台面上的                        动作       页)中的方块说明。 

                                                       Serialize        ( #501  



                                                                                               521 


…………………………………………………………Page 584……………………………………………………………

                   第篇    深入  MFC  程式設計 



             DYNAMIC / DYNCREATE / SERIAL 三 “宏” 



                  我猜你被三组看起来难分难解的宏困扰着,它们是: 



                       DECLARE  D YNAMIC   IMPLEMEN T  D YNAMIC 

                                _          /           _ 



                     DECLARE_DYNCREATE / IMPLEMENT_DYNCREATE 

                       



                     DECLARE_SERIAL / IMPLEMENT_SERIAL 

                       



                  事实上我已经在第3章揭露其源代码及其观念了。这里再以图8…7 三张图片把宏原始 



                  码、展开结果、以及带来的影响做个整理。SERIAL 宏中比较令人费解的是它对》》 运 



                  算子的多载动作。稍后我有一个CArchive 小节,会交待其中细节。 



                    你将在图8…7abc 中看到几个令人困惑的大写常数,像是AFXAPI 、AFXDATA 等等。 



                    它们的意义可以在VC++ 5。0  的DEVSTUDIOVCMFCINCLUDEAFXVER_。H  中获得: 



                    // AFXAPI is used on global public functions 

                    #ifndef AFXAPI 

                           #define AFXAPI __stdcall 



                    #endif 



                    #define AFX_DATA 

                    #define AFX_DATADEF 



                    后二者就像afx_msg 一样(我曾经在第6章的Hello MFC 源代码一出现之后解释过), 



                    是一个〃intentional placeholder〃,可能在将来会用到,目前则为「无物」。 



                    尔曰显浅,彼云艰深,唯其深入,所以浅出 



522 


…………………………………………………………Page 585……………………………………………………………

          。H 



                                                   #define DECLARE_DYNAMIC (class_name)                 AFX。H 

          class CFoo : public CObject            #define DECLARE_DYNAMIC (class_name)  

                                                   public:  

          {                                      public:  

                                                     static AFX_DATA CRuntimeClass class##class_name;  

             DECLARE_DYNAMIC (CFoo)                static AFX_DATA CRuntimeClass class##class_name;  

                                                     virtual CRuntimeClass* GetRuntimeClass() const;  

             。。。                                   virtual CRuntimeClass* GetRuntimeClass() const;  

          } 



                                                                                   class CFoo : public CObject 

         。CPP                                                                      { 

                                                                                  public: 

       IMPLEMENT_DYNAMIC (CFoo; CObject)                                            static AFX_DATA CRuntimeClass classCFoo; 

                                                                                    virtual CRuntimeClass* GetRuntimeClass () const; 

                                                                                    。。。 

               AFX。H                                                               } 



              #define IMPLEMENT_DYNAMIC (class_name; base_class_name)  

            #define IMPLEMENT_DYNAMIC (class_name; base_class_name)  

                     _IMPLEMENT_RUNTIMECLASS(class_name; base_class_name; 0xFFFF; NULL) 

                    _IMPLEMENT_RUNTIMECLASS(class_name; base_class_name; 0xFFFF; NULL) 



              #define _IMPLEMENT_RUNTIMECLASS (class_name; base_class_name; wSchema; pfnNew)  

             #define _IMPLEMENT_RUNTIMECLASS (class_name; base_class_name; wSchema; pfnNew)  

                AFX_DATADEF CRuntimeClass class_name::class##class_name = {  

               AFX_DATADEF CRuntimeClass class_name::class##class_name = {  

                        #class_name; sizeof(class class_name); wSchema; pfnNew;  

                       #class_name; sizeof(class class_name); wSchema; pfnNew;  

                                RUNTIME_CLASS(base_class_name); NULL };  

                               RUNTIME_CLASS(base_class_name); NULL };  

                                                                                                                                                      第 

                static const AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); 

               static const AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); 

                                                                                                                                                      8 

                CRuntimeClass* class_name::GetRuntimeClass() const  

               CRuntimeClass* class_name::GetRuntimeClass() const  

                        { return &class_name::class##class_name; }                                                                                   章 

                       { return &class_name::class##class_name; }                 #define RUNTIME_CLASS (class_name)                                  

                                                                                 #define RUNTIME_CLASS (class_name)                                    

                                                                                          (&class_name::class##class_name)                            D 

                                                                                         (&class_name::class##class_name)                             o 

                                                                                                                    

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的