友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 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 

                                                                                                                                                      c 

                          CFoo::classCFoo                                                                                                             u 

                                                                                                                                                      m 

                                                                                                                                                      e 

                                “CFoo” 

                                                                                                                                                      n 

                                                                         AFX_DATADEF CRuntimeClass CFoo::classCFoo = {                                t

                              sizeof(CFoo)                                                                                                            V 

                                                                                 “CFoo”; sizeof(class CFoo); 0xFFFF; NULL;                            i 

                                                                                                                                                      e 

                                                                                 &CObject::classCObject; NULL };                                      w 

                                                                                                                                                        

                                0xFFFF 

                                                                         static const AFX_CLASSINIT _init_CFoo(&CFoo::classCFoo);                     深 

                           m_pfnCreateObject     NULL                    CRuntimeClass* CFoo::GetRuntimeClass() const                                 入 

                                                                                 { return &CFoo::classCFoo; }                                         探 

                                                                                                                                                      討 

                             m_pBaseClass 

                                                 CObject::classCObject 

                             m_pNextClass        NULL 



5 

2                                                圖8…7a   DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC 

3 


…………………………………………………………Page 586……………………………………………………………

5 

2 

4 



                                                                                                                                    第 

                                                                                                                                     

         。H 

                                                AFX。H 

                                                                                                                                    篇 

                                                                                                                                       

         class CDynobj : public CObject                                                                                                

                                               #define DECLARE_DYNCREATE (class_name)                                              深 

                                                                                                                                    入 

         {                                   #define DECLARE_DYNCREATE (class_name)  

                                                      DECLARE_DYNAMIC(class_name)  

            DECLARE_DYNCREATE (CDynobj)              DECLARE_DYNAMIC(class_name)                                                      

                                                      static CObject* PASCAL CreateObject();                                         M 

            。。。                                      static CObject* PASCAL CreateObject();                                          F 

                                                                                                                                     C 

         }                                                                                                                             

                                                                                                                                    程 

                                                                                                                                    式 

                                                                                                                                    設 

                                                                class CDynobj : public CObject
返回目录 上一页 下一页 回到顶部 9 10
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!