在VC多文档中新建指定文档和关闭指定文档

来源:互联网 发布:明道网页版软件 编辑:程序博客网 时间:2024/06/08 08:11

 

在多文档有时会有这样的需求:能够新建指定的文档并激活,能够关闭指定的文档。我经过研究,得到了下面的一个方法。

这个方法的原理很简单:利用程序的模板管理器,遍历所有模板中的所有文档,如果发现与条件对应的文档则激活或者关闭,否则则新建文档。

直接看代码吧。

一、新建或激活

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类的指针

第二、在新建文档后需要把新建的文档加入到文档模板管理器中。

 
3. VC中怎样关闭所有视类窗口[多文档应用程序]
void CMainFrame::OnCloseWindow() {   CMDIChildWnd* child = MDIGetActive();   while (child)   {      child->MDIDestroy();      child = MDIGetActive();   }}
原创粉丝点击