Программирование на языке 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;

Похожие статьи: