当调用CMultiDocTemplate::OpenDocumentFile时,为第二个参数传递FALSE,此时将不会显示视图窗口,但是一个文档确实已被打开了.
BOOL CMyApp::InitInstance()
{
…
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSinoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CSinoView));
AddDocTemplate(pDocTemplate);
m_pMyDocTemplate = pDocTemplate;
…
}
void CMainFrame::OnFileOpen()
{
m_pDoc=theApp.m_pMyDocTemplate->OpenDocumentFile(
dlg.GetPathName(), FALSE);
//把打开的文档指针保存下来
}
可能在不久之后,你又需要视图窗口来显示这个已打开的文档中的数据.
先跟踪MFC源码,看看CMultiDocTemplate:: OpenDocumentFile打开一个文档的过程.
CDocument* CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
BOOL bMakeVisible)
{
CDocument* pDocument = CreateNewDocument();
…
CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);
…
InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
return pDocument;
}
CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther)
{
CCreateContext context;
context.m_pCurrentFrame = pOther;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = m_pViewClass; // 用来创建视图
context.m_pNewDocTemplate = this;
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // default frame styles
NULL, &context);
很简单,用下面的代码就可以创建一个新的视图来显示已打开的文档中的数据.
void CMainFrame::OnShowData()
{
…
CFrameWnd* pFrame = theApp.m_pMyDocTemplate->CreateNewFrame(m_pDoc, NULL);
…
pFrame->InitialUpdateFrame(m_pDoc, TRUE); // 传递TRUE,打开视图窗口
}
也许你希望用另一个完全不同的视图来显示这个文档中的数据
void CMainFrame::OnShowDataAnother()
{
CCreateContext context;
CAnotherFrame* pFrame = new CAnotherFrame;
// 如果默认的构造函数是protected,那么用下面的语句
//CAnotherFrame*pFrame= //(CAnotherFrame*)RUNTIME_CLASS(CAnotherFrame)->CreateObject();
// CAnotherFrame和下面的CAnotherView没有加入文档模板链表
context.m_pCurrentFrame = pFrame;
pFrame->m_pViewClass = RUNTIME_CLASS(CAnotherView);
pFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW| FWS_ADDTOTITLE, NULL, &context);
pFrame->SetTitle(_T(“Title”));
pFrame->InitialUpdateFrame(NULL, TRUE);
pFrame->GetActiveView()->m_pDoc = m_pDoc;
}