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