RUNTIME及连续错误的解决办法
[/code]今天在做一个视图分割的例子,自己用基于CSplitterWnd编写的一个自定义类;
当利用成员函数创建视图时:
[code]m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMenuDlg),CSize(100,735),pContext)提示错误如下:
error C2039: classCMenuDlg : is not a member of CMenuDlg
看到这个错误,有遇到的朋友第一反应是没有包含头文件,没错的有两种情况:
(1)没有在MainFrame头文件没有包含CMenuDlg的头文件,只要包含即可;
(2)当你发现已经包含了头文件还是出错,那就属于第二种情况了,我根据自己查找的资料得到:
CDialog类创建时默认是不支持动态创建,而MFC为了使类支持动态创建,设计了一套用宏来实现的动态创建机制,在这套宏中,定义了class+类名的数据成员,也就是你这里的classCMenuDlg,只有支持动态创建的类,才有这些数据成员和相应的操作。而CDialog类是不支持的。因此错误提示中就有classCMenuDlg未定义的提示。
解决办法(自己查看例子总结出来):
在CMenuDlg类的头文件添加一句即可,添加后为(红色是添加的):
class CMenuDlg : public CDialog
{
// Construction
public:
CMenuDlg(CWnd* pParent = NULL); // standard constructor
[color=#DC143C]DECLARE_DYNCREATE(CMenuDlg) //允许动态创建,默认是不允许的[/color]
添加完就可以了。
可是我发现问题还没有结束,又来了一个错误提示(类似的,当时忘记截图):
ZLLK.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CZLLKDoc::classCZLLKDoc" (?classCZLLKDoc@CZLLKDoc@@2UCRuntimeClass@@B)
这下又蒙了,继续百度,终于解决了,这里直接给出解决方案(具体的原理推荐阅读侯捷老师的《MFC深入浅出》的动态创建机制,方法如下:
在CMenuDlg类的实现cpp文件前面添加以下语句(记住不是在内部)
IMPLEMENT_DYNCREATE(CMenuDlg, CDialog)
ok,2个问题都解决了,希望对你有帮助。
by L4nk0r 2010-2-28
补充:综合编程 , 安全编程 ,