在多文档有时会有这样的需求:能够新建指定的文档并激活,能够关闭指定的文档。我经过研究,得到了下面的一个方法。
这个方法的原理很简单:利用程序的模板管理器,遍历所有模板中的所有文档,如果发现与条件对应的文档则激活或者关闭,否则则新建文档。
直接看代码吧。
一、新建或激活
void CXXX::OpenFile(const CString &szTitle)
{
CMultiDocTemplate* pTemplate;
POSITION docPos = NULL;
POSITION pos = m_pDocManager->GetFirstDocTemplatePosition();
while (pos)
{
pTemplate = (CMultiDocTemplate*)m_pDocManager->GetNextDocTemplate(pos);
docPos = pTemplate->GetFirstDocPosition();
while (docPos != NULL)
{
CTestDoc* pDoc = (CTestDoc*)pTemplate->GetNextDoc(docPos);
CString szTitle = pDoc->GetTitle();
if (szTitle.Compare(szTitle) == 0)
{
pDoc->m_Frame->ActivateFrame();
return;
}
}
}
CTestDoc* pDoc = new CTestDoc(szTitle);
pDoc->m_Frame = (CFrameWndEx*)pTemplate->CreateNewFrame(pDoc,NULL);
pTemplate->AddDocument(pDoc);
pTemplate->InitialUpdateFrame(pDoc->m_Frame,pDoc);
}
二、关闭
void CXXX::ColseFile(const CString &szTitle)
{
POSITION docPos = NULL;
POSITION pos = m_pDocManager->GetFirstDocTemplatePosition();
while (pos != NULL)
{
CMultiDocTemplate* pTemplate = (CMultiDocTemplate*)m_pDocManager->GetNextDocTemplate(pos);
docPos = pTemplate->GetFirstDocPosition();
while (docPos != NULL)
{
CTestDoc* pDoc = (CTestDoc*)pTemplate->GetNextDoc(docPos);
CString szTitle = pDoc->GetTitle();
if (szTitle.Compare(szTitle) == 0)
{
pDoc->m_Frame->DestroyWindow();
// pTemplate->RemoveDocument(pDoc);
// delete pDoc;
return;
}
}
}
}
或者:
BOOL CMainFrame::ColseFile(const CString &szTitle)
{
// HWND hWndVideo;
// hWndVideo = GetDlgItem(MEDIAMonitor_VideoShow)->m_hWnd;
//CChildFrame childfra;
// HWND hwnd = ::FindWindow(childfra, LoadString(MEDIAMonitor_VideoShow));
// int X = ::IsWindowEnabled(hwnd);
POSITION docPos = NULL;
CClientApp *m_pDocManager = (CClientApp*)AfxGetApp(); //得到应用程序指针
POSITION pos = m_pDocManager->GetFirstDocTemplatePosition();
while (pos != NULL)
{
CMultiDocTemplate* pTemplate = (CMultiDocTemplate*)m_pDocManager->GetNextDocTemplate(pos);
docPos = pTemplate->GetFirstDocPosition();
while (docPos != NULL)
{
CDocument* pDoc = (CDocument*)pTemplate->GetNextDoc(docPos);
CString szMyTitle = pDoc->GetTitle();
if (szMyTitle.Compare(szTitle) == 0)
{
pDoc->OnCloseDocument();
/*pDoc->PreCloseFrame(this);*/
//DestroyWindow();
//MDIGetActive()->PostMessage(WM_CLOSE);
/*hwnd->PostMessage(WM_CLOSE);*/
//pDoc->m_Frame->DestroyWindow();
// pTemplate->RemoveDocument(pDoc);
// delete pDoc;
return TRUE;
}
}
}
return false;
}
在这其中有两个关键点:
第一、文档内需要亲新建一个CFrameWnd类的指针
第二、在新建文档后需要把新建的文档加入到文档模板管理器中。