MFC动态创建对象
2012-01-09 13:31
316 查看
#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \ CObject* PASCAL class_name::CreateObject() \ { return new class_name; } \ IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \ class_name::CreateObject) #define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \ CRuntimeClass* PASCAL class_name::_GetBaseClass() \ { return RUNTIME_CLASS(base_class_name); } \ AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \ #class_name, sizeof(class class_name), wSchema, pfnNew, \ &class_name::_GetBaseClass, NULL, class_init }; \ CRuntimeClass* PASCAL class_name::GetThisClass() \ { return _RUNTIME_CLASS(class_name); } \ CRuntimeClass* class_name::GetRuntimeClass() const \ { return _RUNTIME_CLASS(class_name); } #define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name)) 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(); BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const; // Implementation void Store(CArchive& ar) const; static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum); // CRuntimeClass objects linked together in simple list CRuntimeClass* m_pNextClass; // linked list of registered classes }; //class_name::CreateObject --> pfnNew --> 创建对象的函数指针 //例子 IMPLEMENT_DYNCREATE(Cview1, CFormView) => Object* PASCAL Cview1::CreateObject() { return new Cview1; } pWnd = (CWnd*)pViewClass->CreateObject(); /////////////////////////////////////////////// DECLARE_DYNCREATE(Cview1) #define DECLARE_DYNCREATE(class_name) \ DECLARE_DYNAMIC(class_name) \ static CObject* PASCAL CreateObject(); #define DECLARE_DYNAMIC(class_name) \ protected: \ static CRuntimeClass* PASCAL _GetBaseClass(); \ public: \ static const AFX_DATA CRuntimeClass class##class_name; \ virtual CRuntimeClass* GetRuntimeClass() const; \ CObject* CRuntimeClass::CreateObject() { if (m_pfnCreateObject == NULL) { TRACE(_T("Error: Trying to create object which is not ") _T("DECLARE_DYNCREATE \nor DECLARE_SERIAL: %hs.\n"), m_lpszClassName); return NULL; } CObject* pObject = NULL; TRY { pObject = (*m_pfnCreateObject)(); } END_TRY return pObject; }
相关文章推荐
- MFC中关于运行时类信息及动态创建对象的两个宏的意义
- 仿MFC实现c++按名动态创建对象之续(瘦身以及解决其在dll中使用的问题)
- MFC之对象的动态创建
- [MFC]动态对象创建、文档模板加载.rc资源
- MFC中动态创建对象的一点思考
- 【框架-MFC】动态创建HICON或HCURSOR对象
- MFC中动态创建对象的一点思考
- MFC类别型录网之对象动态创建
- 仿MFC实现c++的按名动态创建对象功能
- MFC动态创建可停靠窗口,窗口添加控件并读写控件中的数据
- 《C++编程思想》 第十二章 动态对象创建 (原书代码+习题+解答)
- 在MFC中创建动态控件的生成与响应
- MFC复习和学习 第五章 MFC动态创建 MFC文档 MFC消息处理 MFC单文档应用程序 MFC多文档应用程序
- MFC动态创建控件及添加消息响应
- C++ 类工厂实现动态对象创建
- Silverlight动态创建XAML对象和遍历对象
- 从零开始学C++之模板(四):用模板实现单例模式、模板方式实现动态创建对象
- C++动态创建对象
- MFC 类型识别与动态创建
- c#动态编译执行对象方法示例 运用映射机制创建对象