//在CXXApp类的InitInstance函数中添加一个文档模板 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_XXXTYPE, RUNTIME_CLASS(CXXXDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CXXXView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); pDocTemplate = new CMultiDocTemplate(IDR_XXXTYPE, RUNTIME_CLASS(CXXXDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CXXXView2)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); // 然后运行程序会弹出类似这样的New对话框,要求让用户选择。
// 很多时候我们会在菜单里有对应的菜单项来表示用户想用哪一种模板来创建,而不是弹出这样的对话框来让用户选择。要做到这一点,需要参考MFC的源代码 ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew) // 注意App类的消息响应函数中这里的对ID_FILE_NEW响应的函数中CWinApp类中OnFileNew // 然后看看CWinApp类的OnFileNew是怎样对ID_FILE_NEW菜单项做出响应的,从下面的代码中可以看到是调用CDocManager类的OnFileNew函数, // CDocManager类你可以看到是用来管理文档模板的,在CWinApp类中有该成员的定义 CDocManager* m_pDocManager; // Pointer to CDocManager used to manage document templates // for this application instance. void CWinApp::OnFileNew() { if (m_pDocManager != NULL) m_pDocManager->OnFileNew(); } // 然后F11进入CDocManager类的OnFileNew函数中 void CDocManager::OnFileNew() { if (m_templateList.IsEmpty()) { TRACE(traceAppMsg, 0, "Error: no document templates registered with CWinApp.\n"); AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC); return; } CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead(); if (m_templateList.GetCount() > 1) { // more than one document template to choose from // bring up dialog prompting user CNewTypeDlg dlg(&m_templateList); INT_PTR nID = dlg.DoModal(); // 看到这里,我们就清楚了吧,它为什么会弹出一个New对话框让我们来选择了。:) if (nID == IDOK) pTemplate = dlg.m_pSelectedTemplate; else return; // none - cancel operation } ASSERT(pTemplate != NULL); ASSERT_KINDOF(CDocTemplate, pTemplate); pTemplate->OpenDocumentFile(NULL); // if returns NULL, the user has already been alerted } // 如果我们不想弹出这个对话框,就可以参考上面的代码去修改我们自己的OnFileNew函数,类似的实现可以参考下面的代码 // CXXXApp类的.h 文件中加入 afx_msg void OnFileNew(); // CXXXApp类的.cpp 文件的消息响应部分 ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew) // 需要修改成为 ON_COMMAND(ID_FILE_NEW, &CXXXApp::OnFileNew) // 下面是OnFileNew函数的具体的实现 void CXXXApp::OnFileNew() { int nDocTmplateIndex = 0; // 这里你可以定义为一个成员变量,指示用哪个模板来创建,这里写死只是为了做演示而已 :) CDocTemplate* pTemplate = NULL; int nIndex = 0; POSITION pos = GetFirstDocTemplatePosition(); while(pos) { CDocTemplate* pTemplate = GetNextDocTemplate(pos); if(nDocTmplateIndex == nIndex++) { ASSERT(pTemplate != NULL); ASSERT_KINDOF(CDocTemplate, pTemplate); pTemplate->OpenDocumentFile(NULL); break; } } }