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這個基類決定的,繼承於它,受制於它,沒辦法啊!
有什麼高見的可以留言交流,本人也是菜鳥一個,歡迎拍磚!!!

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