

Программирование на языке MFC
Мой второй блог в серии программирования
Макрос DECLARE_DYNCREATE
Как нетрудно заметить, макрос DECLARE_DYNCREATE() выполняет макрос DECLARE_DYNAMIC()f а затем добавляет к описанию класса метод CreateObjectQ. В реализации класса необходимо будет использовать макрос IMPLEMENTJDYNCREATE(), исходный текст которого находится в файле afx.h:
#define IMPLEMENT_DYNCREATE (class_name, base_class_name) \ CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \ IMPLEMENT_RUNTIMECLASS(class_name,
base_class_name, OxFFFF, \ class_name::CreateObject)
Очевидно, что помимо того же, что делает макрос DECLARE-_DYNAMIC(), макрос DECLARE_DYNCREATE() формирует исходный текст метода CreateObjectQ.
Для того чтобы продемонстрировать изложенное выше, я написал небольшую программу, исходный текст которой приведен ниже:
#include <afxwin.h>
II Объявляем класс приложения, его поля и методы.
class CRuntimelnfоАрр : public CWinApp
{
DECLARE_DYNCREATE( CRuntimelnfоАрр ); public:
CRuntimelnfoApp();
-CRuntimelnfoApp(); virtual BOOL Initlnstance ();
};
IMPLEMENT_DYNCREATE( CRuntimelnfoApp, CWinApp )
// Конструктор класса приложения. CRuntimelnfoApp::CRuntimelnfoApp() { }
// Деструктор класса приложения. CRuntimelnfoApp::-CRuntimelnfoApp() { }
// Инициализация класса приложения. BOOL CRuntimelnfoApp::Initlnstance() {
for ( CRuntimeClass* pRuntimelnfo=RUNTIME_CLASS (CRuntimelnfoApp ) ; pRuntimelnfo != NULL; pRuntimelnfo = (*pRuntimeInfo->m_pfnGetBaseClass)
0 ) {
TRACE( "Class name – %s\n
object size = %d\n schema = %08x\n
.pointer to CreateObject() = %08x\n pointer ro _GetBaseClass = %08x\n pointer to the next class = %08x\n",
pRuntimelnfo->m_lpszClassName,
pRuntimeInfo->m_nObjectSize,
pRuntimelnfo->m_wSenema,
pRuntimelnfo->m_pfnCreateObject,
pRuntimeInfo->m_pfnGetBaseClass,
pRuntimelnfo->m_pNextClass);
}
return TRUE;
}
CRuntimelnfoApp theApp;
Похожие статьи: CWinApp
