#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name,wSchema,pfnNew) \
static char _lpsz##class_name[] = #class_name; \
CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; }
这个宏定义的第三行到第五行是什么意思?另外第二行的#class_name就一个#号是什么意思,谢谢了!
static char _lpsz##class_name[] = #class_name; \
CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; }
这个宏定义的第三行到第五行是什么意思?另外第二行的#class_name就一个#号是什么意思,谢谢了!
_IMPLEMENT_RUNTIMECLASS(CButton, CWnd, wSchema, pfnNew)
被展开成
static char _lpszCButton[] = "CButton";
CRuntimeClass class_name::classCButton = {
_lpszCButton,
sizeof(CButton),
wSchema,
pfnNew,
RUNTIME_CLASS(CWnd),
NULL
};
static AFX_CLASSINIT _init_CButton(CButton::classCButton);
CRuntimeClass* CButton::GetRuntimeClass() const
{
return &CButton::classCButton;
}##则是把前后两个symbol直接相连
CRuntimeClass CButton::classCButton = {
_lpszCButton,
sizeof(CButton),
wSchema,
pfnNew,
RUNTIME_CLASS(CWnd),
NULL
};
CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL };
这个是什么意思啊?
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
请问“::”后的是那个成员是CRuntimeClass结构体里的哪个成员?
附:
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
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};