- struct CRuntimeClass
- {
- // Attributes
- LPCSTR m_lpszClassName; //-------------类型识别宏用到
- int m_nObjectSize;
- UINT m_wSchema; // schema number of the loaded class
- CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class //-------------动态创建宏用到
- #ifdef _AFXDLL
- CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
- #else
- CRuntimeClass* m_pBaseClass;//-------------类型识别宏用到
- #endif
- // Operations
- CObject* CreateObject();//-------------动态创建宏用到
- ...
- };
类型识别宏 用来建立类型识别网,通过它可以知道继承关系
DECLARE_DYNAMIC(class_name)
IMPLEMENT_DYNAMIC(class_name, base_class_name)
struct CRuntimeClass
{
...
LPCSTR m_lpszClassName; //类名
CRuntimeClass* m_pBaseClass;//基类名
...
}
- //以一个MDI应用程序的CMainFrame类为例:
- //in MaimFrm.h
- class CMainFrame : public CMDIFrameWnd
- {
- DECLARE_DYNAMIC(CMainFrame)
- ...//
- }
- //in MaimFrm.cpp
- IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
- ...//
- //展开后得:
- //in MaimFrm.h
- class CMainFrame : public CMDIFrameWnd
- {
- public:
- static const CRuntimeClass classCMainFrame;
- virtual CRuntimeClass* GetRuntimeClass() const;
- ...//
- }
- //in MaimFrm.cpp
- AFX_COMDAT const CRuntimeClass CMainFrame::classCMainFrame =
- {CMainFrame,sizeof(classCMainFrame ),0xFFFF,NULL,(CRuntimeClass*)(&CMDIFrameWnd::classCMDIFrameWnd),NULL,NULL};
- CRuntimeClass* CMainFrame::GetRuntimeClass() const
- { 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();
...
};
- //以SDI程序中的CMainFrame的动态创建为例
-
- //in MaimFrm.h
- class CMainFrame : public CFrameWnd
- {
- DECLARE_DYNCREATE(CMainFrame)
- ...//
- }
- //in MaimFrm.cpp
- IMPLEMENT_DYNCREATE(CMainFrame, CMDIFrameWnd)
- ...//
- //展开后
- //in MainFrm.h
- class CMainFrame
- {
- public:
- static const CRuntimeClass classCMainFrame;
- virtual CRuntimeClass* GetRuntimeClass() const;
- static CObject* PASCAL CreateObject();
- ...//
- };
- //in MainFrm.cpp
- CObject* PASCAL CMainFrame::CreateObject() { return new classCMainFrame; }
- AFX_COMDAT const CRuntimeClass CMainFrame::classCMainFrame =
- {CMainFrame,sizeof(classCMainFrame),0xFFFF,CMainFrame::CreateObject,(CRuntimeClass*)(&CMDIFrameWnd::classCMDIFrameWnd),NULL,NULL};
- CRuntimeClass* CMainFrame::GetRuntimeClass() const
- {
- return &CMainFrame::classCMainFrame;
- }
摘自
本文介绍MFC中使用DECLARE_DYNAMIC及IMPLEMENT_DYNAMIC宏实现类型识别的方法,同时展示了如何利用DECLARE_DYNCREATE及IMPLEMENT_DYNCREATE宏进行对象的动态创建。通过具体的CMainFrame类实例,详细解析了这些宏的工作原理。

被折叠的 条评论
为什么被折叠?



