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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值