在侯俊杰所著的《深入浅出mfc》第二版中的第三章对mfc动态创建的仿真有如下代码:
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; CObject* CreateObject();
static CRuntimeClass* PASCAL Load(); // CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass* pNewClass); };#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();#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; } \#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)#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)
我的问题:
1,那些宏定义后面的‘\’是什么意思例如:
“#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();”
2, CObject* (PASCAL* m_pfnCreateObject)(); 是什么意思,m_pfnCreateObject
的值如何获得,《深入浅出mfc》说,只有当m_pfnCreateObject不为NULL时可动态创建,但是m_pfnCreateObject的值是如何的到的?如以下述为例:
class CWnd : public CCmdTarget
{
DECLARE_DYNCREATE(CWnd)
public:
CWnd::CWnd() {
cout << "CWnd Constructor \n";
}
CWnd::~CWnd() {
}
}
IMPLEMENT_DYNCREATE(CWnd, CCmdTarget);
附:请看过这本书的朋友或是可以帮我解释以下的朋友帮帮忙,由于小弟初次接触windows编程还请解释的详细一点。小弟在此谢过了。
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; CObject* CreateObject();
static CRuntimeClass* PASCAL Load(); // CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass* pNewClass); };#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();#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; } \#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)#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)
我的问题:
1,那些宏定义后面的‘\’是什么意思例如:
“#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();”
2, CObject* (PASCAL* m_pfnCreateObject)(); 是什么意思,m_pfnCreateObject
的值如何获得,《深入浅出mfc》说,只有当m_pfnCreateObject不为NULL时可动态创建,但是m_pfnCreateObject的值是如何的到的?如以下述为例:
class CWnd : public CCmdTarget
{
DECLARE_DYNCREATE(CWnd)
public:
CWnd::CWnd() {
cout << "CWnd Constructor \n";
}
CWnd::~CWnd() {
}
}
IMPLEMENT_DYNCREATE(CWnd, CCmdTarget);
附:请看过这本书的朋友或是可以帮我解释以下的朋友帮帮忙,由于小弟初次接触windows编程还请解释的详细一点。小弟在此谢过了。
解决方案 »
- 想了几天没想出来的问题WINSDK的
- 为何创建的工具栏按钮有4个,包括中间的分隔条,但图标第一个按钮显示第2个图标(IDI_IMAGE),第二个按钮显示第3个图标(IDI_IMAGE),第三个按钮没图标?为何,请帮助。
- c++爱好者群32052092,欢迎各位交流
- 高手点拨一下,如何上手VC?
- MFC程序如何压缩?
- 如何取得某个应用程序可执行文件的全路径?
- 各位大哥来看看吧。。。
- “你会惊奇地发现,Windows Explorer是在高优先级上运行的”,关于《WINDOWS核心编程》的一个问题?
- 寻求《VC++数字图像处理》电子版和光盘源码,作者:周长发。送分~!!还有其他问题另送高分
- 600分的WinSock问题!!想做下个月专家榜的第一吗???说话算数肯定给!
- 用BCG改不了Tasks Pane的标题?
- 求救!!!帮忙,,大侠帮忙。。。
CObject* (PASCAL* m_pfnCreateObject)()这是该指针指向函数的形式(没有参数,返回CObject*)