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

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


                    #0164 

                    #0165  // global function 

                    #0166  CWinApp* AfxGetApp(); 



                    MFC。CPP 



                    #0001  #include 〃my。h〃  //  

                                                 原该包含mfc。h 就好,但为了CMyWinApp 的定义,所以。。。 

                    #0002 

                    #0003  extern CMyWinApp theApp; 

                    #0004 

                    #0005  static char szCObject'' = 〃CObject〃; 

                    #0006  struct CRuntimeClass CObject::classCObject = 

                    #0007          { szCObject; sizeof(CObject); 0xffff; NULL; NULL }; 

                    #0008  static AFX_CLASSINIT _init_CObject(&CObject::classCObject); 

                    #0009 

                    #0010  CRuntimeClass* CRuntimeClass::pFirstClass = NULL; 

                    #0011 

                    #0012  AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass) 

                    #0013  { 

                    #0014          pNewClass…》m_pNextClass = CRuntimeClass::pFirstClass; 

                    #0015          CRuntimeClass::pFirstClass = pNewClass; 

                    #0016  } 

                    #0017 

                    #0018  CRuntimeClass* CObject::GetRuntimeClass() const 



136 


…………………………………………………………Page 199……………………………………………………………

                                                第3章    MFC 六大關鍵技術之模擬 



#0019  { 

#0020          return &CObject::classCObject; 

#0021  } 

#0022 

#0023  BOOL CWnd::Create() 

#0024  { 

#0025    return TRUE; 

#0026  } 

#0027 

#0028  BOOL CWnd::CreateEx() 

#0029  { 

#0030    PreCreateWindow(); 

#0031    return TRUE; 

#0032  } 

#0033 

#0034  BOOL CWnd::PreCreateWindow() 

#0035  { 

#0036    return TRUE; 

#0037  } 

#0038 

#0039  BOOL CFrameWnd::Create() 

#0040  { 

#0041    CreateEx(); 

#0042    return TRUE; 

#0043  } 

#0044 

#0045  BOOL CFrameWnd::PreCreateWindow() 

#0046  { 

#0047    return TRUE; 

#0048  } 

#0049 

#0050  IMPLEMENT_DYNAMIC(CCmdTarget; CObject) 

#0051  IMPLEMENT_DYNAMIC(CWinThread; CCmdTarget) 

#0052  IMPLEMENT_DYNAMIC(CWinApp; CWinThread) 

#0053  IMPLEMENT_DYNAMIC(CWnd; CCmdTarget) 

#0054  IMPLEMENT_DYNAMIC(CFrameWnd; CWnd) 

#0055  IMPLEMENT_DYNAMIC(CDocument; CCmdTarget) 

#0056  IMPLEMENT_DYNAMIC(CView; CWnd) 

#0057 

#0058  // global function 

#0059  CWinApp* AfxGetApp() 

#0060  { 

#0061    return theApp。m_pCurrentWinApp; 

#0062  } 



                                                                                 137 


…………………………………………………………Page 200……………………………………………………………

                    第篇  勿在浮砂築高台 



                    MY。H 



                    #0001  #include  

                    #0002  #include 〃mfc。h〃 

                    #0003 

                    #0004  class CMyWinApp : public CWinApp 

                    #0005  { 

                    #0006  public: 

                    #0007    CMyWinApp::CMyWinApp()   { 

                    #0008                                 } 

                    #0009    CMyWinApp::~CMyWinApp()  { 

                    #0010                                 } 

                    #0011 

                    #0012    virtual BOOL InitInstance(); 

                    #0013  }; 

                    #0014 

                    #0015  class CMyFrameWnd : public CFrameWnd 

                    #0016  { 

                    #0017  public: 

                    #0018    CMyFrameWnd(); 

                    #0019    ~CMyFrameWnd()  { 

                    #0020                       } 

                    #0021  }; 

                    #0022 

                    #0023 

                    #0024  class CMyDoc : public CDocument 

                    #0025  { 

                    #0026  public: 

                    #0027    CMyDoc::CMyDoc()  { 

                    #0028                         } 

                    #0029    CMyDoc::~CMyDoc() { 

                    #0030                         } 

                    #0031  }; 

                    #0032 

                    #0033  class CMyView : public CView 

                    #0034  { 

                    #0035  public: 

                    #0036    CMyView::CMyView()   { 

                    #0037                            } 

                    #0038    CMyView::~CMyView()  { 

                    #0039                            } 

                    #0040  }; 

                    #0041 

                    #0042  // global function 

                    #0043  void PrintAllClasses(); 



138 


…………………………………………………………Page 201……………………………………………………………

                                                  第3章    MFC 六大關鍵技術之模擬 



MY。CPP 



#0001  #include 〃my。h〃 

#0002 

#0003  CMyWinApp theApp; 

#0004 

#0005  BOOL CMyWinApp::InitInstance() 

#0006  { 

#0007      m_pMainWnd = new CMyFrameWnd; 

#0008      return TRUE; 

#0009  } 

#0010 

#0011  CMyFrameWnd::CMyFrameWnd() 

#0012  { 

#0013      Create(); 

#0014  } 

#0015 

#0016  void PrintAllClasses() 

#0017  { 

#0018      CRuntimeClass* pClass; 

#0019 

#0020      // just walk through the simple list of registered classes 

#0021      for (pClass = CRuntimeClass::pFirstClass; pClass != NULL; 

#0022              pClass = pClass…》m_pNextClass) 

#0023      { 

#0024          cout m_lpszClassName Run(); 

#0039 

#0040    PrintAllClasses(); 

#0041  } 



                                                                                    139 


…………………………………………………………Page 202……………………………………………………………

                   第篇  勿在浮砂築高台 



              IsKindOf       (型别辨识) 



                      有了图3…1 这张「类别型录」网,要实现IsKindOf  功能,再轻松不过了: 



                      1。 为CObject 加上一个IsKindOf  函数,于是此函数将被所有类别继承。它将把 



                        参数所指定的某个CRuntimeClass 对象拿来与类别型录中的元素一一比对。比 



                        对成功(在型录中有发现),就传回TRUE,否则传回FALSE : 



                       // in header file 

                       class CObject 

                       { 

                       public: 

                         。。。 

                         BOOL IsKindOf(const CRuntimeClass* pClass) const; 

                       }; 



                       // in implementation file 

                       BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const 

                       { 

                               CRuntimeClass* pClassThis = GetRuntimeClass(); 

                               while (pClassThis != NULL) 

                               { 

                                       if (pClassThis == pClass) 

                                               return TRUE; 

                                       pClassThis = pClassThis…》m_pBaseClass; 

                               } 

                               return FALSE;       // walked to the top; no match 

                       } 



                       注意,while 循环中所追踪的是「同宗」路线,也就是凭借着m_pBaseClass 而非 



                       m_pNextClass。假设我们的调用是: 



                             CView* pView = new CView; 



                             pView…》IsKindOf(RUNTIME_CLASS(CWinApp)); 



                       IsKindOf  的参数其实就是&CWinApp::classCWinApp 。函数内利用GetRuntimeClass 



                       先取得&CView::classCView,然后循线而上(从图3…1 来看,所谓循线分别是指 



                       CView、CWnd、CCmdTarget、CObject),每获得一个CRuntimeClass 对象指针,就 



                       拿来和CView::classCView  的指针比对。靠这个土方法,完成了IsKindOf  能力。 



140 


…………………………………………………………Page 203……………………………………………………………

                                                  第3章    MFC 六大關鍵技術之模擬 



   2。  IsKindOf   的使用方式如: 



       CMyDoc* pMyDoc = new CMyDoc; 

       CMyView* pMyView = new CMyView; 



       cout IsKindOf(RUNTIME_CLASS(CMyDoc));      // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CDocument));   // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CCmdTarget));  // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CObject));     // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CWinApp));     // 應該獲得 FALSE 

       cout IsKindOf(RUNTIME_CLASS(CView));       // 應該獲得 FALSE 



       cout IsKindOf(RUNTIME_CLASS(CView));      // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CObject));    // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CWnd));       // 應該獲得 TRUE 

       cout IsKindOf(RUNTIME_CLASS(CFrameWnd)); // 应该获得FALSE 



      IsKindOf  的完整范例放在Frame4  中。 



Frame4  范例程序 



      Frame4 与Frame3 大同小异,唯一不同的就是前面所说的,在CObject 中加上IsKindOf  函 



      数的声明与定义,并将私有类别(non…MFC 类别)也挂到「类别型录网」中: 



      // in header file 



      class CMyFrameWnd : public CFrameWnd 



       { 



      DECLARE_DYNAMIC(CMyFrameWnd) // 在MFC 程序中这里其实是DECLARE_DYNCREATE() 



       。。。 // 稍后我便会仿真DECLARE_DYNCREATE() 给你看 



       }; 



      class CMyDoc : public CDocument 



       { 



      DECLARE_DYNAMIC(CMyDoc) // 在MFC 程序中这里其实是DECLARE_DYNCREATE() 



       。。。 // 稍后我便会仿真DECLARE_DYNCREATE() 给你看 



       }; 



      class CMyView : public CView 



       { 



      DECLARE_DYNAMIC(CMyView) // 在MFC 程序中这里其实是DECLARE_DYNCREATE() 



       。。。 // 稍后我便会仿真DECLARE_DYNCREATE() 给你看 



       }; 



                                                                                  141 


…………………………………………………………Page 204……………………………………………………………

                  第篇  勿在浮砂築高台 



                  // in implementation file 

                  。。。 

                                                               在    程序中这里其实是  

                   IMPLEMENT_DYNAMIC(CMyFrameWnd; CFrameWnd) //  MFC               IMPLEMENT_DYNCREATE () 

                                                                  // 稍后我便会仿真IMPLEMENT_DYNCREATE () 给你看 

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