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

本文介绍了VC++中实现多文档应用的方法,包括如何新建或激活指定文档、关闭指定文档及关闭所有视类窗口。通过具体的代码示例,展示了如何利用模板管理器遍历文档进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

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

直接看代码吧。

一、新建或激活

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();
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值