最近由于一个项目的需要,要求用MFC来做界面,其中有个地方需要新建一个文档,这个文档是子框架,于是我新建了frame,doc和view,分别叫做CTestChildFrame(::CMDIChildWnd),CTestDoc(::CDocument)和CTestView(::CFormView),工程名叫
Project,并且在App文件中把他们用一个多文档模板关联起来。
代码如下:
//多文档模板
(此段代码不懂的自己上网查查)
我上网找了好久,没解决,最终还是在一位用过这个类的高手帮助下解决了,神马原因呢?表面上看我的步骤没什么问题,手动添加的代码也是对的。为什么呢?别急,马上揭晓答案。。。。。。
我们注意到上面一段代码的注释,“dialog template must existand be invisible with WS_CHILD set”----
对话框模板必须存在且是不可见和子窗口样式。由于我的CTestView是继承于CFormView这个类,我以为我的View有了,显示就可以了,殊不知,还需新建一个Dialog,即前面的
IDR_Test须有一个对应的对话框资源,对话框的ID就是
IDR_Test,设置成
invisible和WS_CHILD,然后就ok了。我找错好久的原因是想不通为啥要新建一个不可见的对话框,说实话现在也不太明白,但是知道这是CFormView这个基类决定的,继承于它,受制于它,没办法啊!
CMultiDocTemplate *
pDocTemplate;
RUNTIME_CLASS(
CTestDoc),
RUNTIME_CLASS(
CTestChildFrame),
RUNTIME_CLASS(
CTestView));
//手动创建框架(此段代码不懂的自己上网查查)
return;
return;
我们注意到上面
CreateNewFrame函数,我在做的过程中执行到这里出错了,报的DebugAssertionFailed!错误,提示出错地方是viewform.cpp中第90行,后来跟踪发现就是viewform.cpp文件(VS自带的)中CFormView::Create()函数
// dialog template must exist and be invisiblewith WS_CHILD set
ASSERT(FALSE);
// invalid dialog template name
(这个地方报错)
PostNcDestroy();
// cleanup if Create fails too soon
return FALSE;
pDocTemplate
= newCMultiDocTemplate(
IDR_Test,
if(!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
CTestDoc *pDoc =(CTestDoc*)((CProjectApp*)AfxGetApp())->pDocTemplate->CreateNewDocument();
if(pDoc==NULL)
CFrameWnd * pFrame=((
CProjectApp*)AfxGetApp())->pDocTemplate->
CreateNewFrame(pDoc,NULL);
if(pFrame==NULL)
((
CProjectApp*)AfxGetApp())->pDocTemplate->InitialUpdateFrame(pFrame,pDoc);
==================================================================================================
if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
{
}
==================================================================================================
有什么高见的可以留言交流,本人也是菜鸟一个,欢迎拍砖!!!