您的位置:首页 > 其它

MFC 的MDI创建空文档调用过程

2017-10-13 22:03 337 查看
1,XXApp类中的消息映射

ON_COMMAND(ID_FILE_NEW,
CWinAppEx::OnFileNew)

2,

void CWinApp::OnFileNew()
{
       if(m_pDocManager != NULL)
             
m_pDocManager->OnFileNew();
}

3,
void CDocManager::OnFileNew()
{
       if(m_templateList.IsEmpty())
       {
              TRACE(traceAppMsg, 0, "Error: no document templates registered withCWinApp.\n");
              AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
              return;
       }
 
       CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
       if (m_templateList.GetCount()> 1)
       {
              // morethan one document template to choose from
              // 超过一个doctemplate出现对话框让用户选择
              CNewTypeDlg dlg(&m_templateList);
              INT_PTR nID = dlg.DoModal();
              if(nID == IDOK)
                     pTemplate =dlg.m_pSelectedTemplate;
              else
                     return;    
// none - canceloperation
       }
 
       ASSERT(pTemplate != NULL);
       ASSERT_KINDOF(CDocTemplate, pTemplate);
 
       pTemplate->OpenDocumentFile(NULL);
              // ifreturns NULL, the user has already been alerted
}
4,

CDocument*CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bAddToMRU, BOOLbMakeVisible)
{
       CDocument* pDocument = CreateNewDocument(); 创建Doc类对象
       if(pDocument == NULL)
       {
              TRACE(traceAppMsg, 0, "CDocTemplate::CreateNewDocument returnedNULL.\n");
              AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
              returnNULL;
       }
       ASSERT_VALID(pDocument);
 
       BOOL bAutoDelete =pDocument->m_bAutoDelete;
       pDocument->m_bAutoDelete = FALSE;  
// don't destroyif something goes wrong
       CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL); 创建ChildFrame和View对象
       pDocument->m_bAutoDelete = bAutoDelete;
       if(pFrame == NULL)
       {
              AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
              deletepDocument;      
//explicit delete on error
              returnNULL;
       }
       ASSERT_VALID(pFrame);
 
       if(lpszPathName == NULL)
       {
              //create a new document - with default document name
              SetDefaultTitle(pDocument);
 
              // avoidcreating temporary compound file when starting up invisible
              if(!bMakeVisible)
                     pDocument->m_bEmbedded =TRUE;
 
              if(!pDocument->OnNewDocument())虚函数
              {
                     //user has be alerted to what failed in OnNewDocument
                     TRACE(traceAppMsg, 0,
"CDocument::OnNewDocument returned FALSE.\n");
                     pFrame->DestroyWindow();
                     returnNULL;
              }
 
              // itworked, now bump untitled count
              m_nUntitledCount++;
       }
       else
       {
              // openan existing document
              CWaitCursor wait;
              if(!pDocument->OnOpenDocument(lpszPathName))
              {
                     //user has be alerted to what failed in OnOpenDocument
                     TRACE(traceAppMsg, 0,
"CDocument::OnOpenDocument returned FALSE.\n");
                     pFrame->DestroyWindow();
                     returnNULL;
              }
              pDocument->SetPathName(lpszPathName,bAddToMRU);
              pDocument->OnDocumentEvent(CDocument::onAfterOpenDocument);
       }
 
       InitialUpdateFrame(pFrame, pDocument,bMakeVisible);
       return pDocument;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc
相关文章推荐