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这个基类决定的,继承于它,受制于它,没办法啊!
有什么高见的可以留言交流,本人也是菜鸟一个,欢迎拍砖!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章