MFC复习(四)MFC执行期类型识别与动态创建技术

本文介绍MFC中使用DECLARE_DYNAMIC及IMPLEMENT_DYNAMIC宏实现类型识别的方法,同时展示了如何利用DECLARE_DYNCREATE及IMPLEMENT_DYNCREATE宏进行对象的动态创建。通过具体的CMainFrame类实例,详细解析了这些宏的工作原理。

 

  1. struct CRuntimeClass
  2. {
  3.     // Attributes
  4.     LPCSTR m_lpszClassName;     //-------------类型识别宏用到
  5.     int m_nObjectSize;
  6.     UINT m_wSchema; // schema number of the loaded class
  7.     CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class //-------------动态创建宏用到
  8.     #ifdef _AFXDLL
  9.      CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
  10.     #else
  11.      CRuntimeClass* m_pBaseClass;//-------------类型识别宏用到
  12.     #endif
  13.     // Operations
  14.     CObject* CreateObject();//-------------动态创建宏用到
  15.     ...
  16. };

类型识别宏 用来建立类型识别网,通过它可以知道继承关系

DECLARE_DYNAMIC(class_name)
IMPLEMENT_DYNAMIC(class_name, base_class_name)
struct CRuntimeClass

...

    LPCSTR m_lpszClassName;     //类名

    CRuntimeClass* m_pBaseClass;//基类名

...

 

  1. //以一个MDI应用程序的CMainFrame类为例:
  2. //in MaimFrm.h
  3. class CMainFrame : public CMDIFrameWnd
  4. {
  5.     DECLARE_DYNAMIC(CMainFrame)
  6.     ...//
  7. }
  8. //in MaimFrm.cpp
  9. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
  10. ...//
  11. //展开后得:
  12. //in MaimFrm.h
  13. class CMainFrame : public CMDIFrameWnd
  14. {
  15. public
  16.     static const CRuntimeClass classCMainFrame; 
  17.     virtual CRuntimeClass* GetRuntimeClass() const
  18.     ...//
  19. }
  20. //in MaimFrm.cpp
  21. AFX_COMDAT const CRuntimeClass CMainFrame::classCMainFrame =
  22.     {CMainFrame,sizeof(classCMainFrame  ),0xFFFF,NULL,(CRuntimeClass*)(&CMDIFrameWnd::classCMDIFrameWnd),NULL,NULL};
  23. CRuntimeClass* CMainFrame::GetRuntimeClass() const 
  24. return &CMainFrame::classCMainFrame; } 

 

动态创建宏   其实就是多实现了CreateObject函数

(注意此时类构造函数为protected类型,所以其实例只能通过CreateObject来构造)

DECLARE_DYNCREATE(class_name)
IMPLEMENT_DYNCREATE(class_name, base_class_name)

struct CRuntimeClass

...

    CObject* (PASCAL* m_pfnCreateObject)(); //指向CreateObject的函数指针

    CObject* CreateObject();

...

};

 

  1. //以SDI程序中的CMainFrame的动态创建为例
    • //in MaimFrm.h
    • class CMainFrame : public CFrameWnd
    • {
    •     DECLARE_DYNCREATE(CMainFrame)
    •     ...//
    • }
    • //in MaimFrm.cpp
    • IMPLEMENT_DYNCREATE(CMainFrame, CMDIFrameWnd)
    • ...//
    • //展开后
  2. //in MainFrm.h
  3. class CMainFrame
  4. {  
  5.    public
  6.      static const CRuntimeClass classCMainFrame; 
  7.      virtual CRuntimeClass* GetRuntimeClass() const
  8.      static CObject* PASCAL CreateObject();
  9.      ...//
  10. };
  11. //in MainFrm.cpp
  12. CObject* PASCAL CMainFrame::CreateObject() { return new classCMainFrame; } 
  13. AFX_COMDAT const CRuntimeClass CMainFrame::classCMainFrame =
  14.     {CMainFrame,sizeof(classCMainFrame),0xFFFF,CMainFrame::CreateObject,(CRuntimeClass*)(&CMDIFrameWnd::classCMDIFrameWnd),NULL,NULL};
  15. CRuntimeClass* CMainFrame::GetRuntimeClass() const 
  16. {
  17.     return &CMainFrame::classCMainFrame;

 

摘自

http://www.chinaitpower.com/A/2001-10-06/880.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值