如题

解决方案 »

  1.   

    调用你的CWinApp的OpenDocumentFile(yourfilepath)函数
      

  2.   

    请问xiaoqiqixiao(七七) :我调用了theApp.OpenDocumentFile(FileName),能建立子窗体并打开文件,但是同一个文件只能打开一次,再次打开只能把以前已打开的同名的文件的子窗体调到前端。这是为何?
      

  3.   

    你有看过哪个MDI程序可以同一个文件打开多次的,有这个必要吗?
    根据你的意图请参考下列选项:
    1.调用你的CDocument的OnFileClose关闭你的文件,再重新打开。
    2.调用你的CDocument的OnFileSaveAs将你的文件另存为别的文件名,再打开你原来的文件。
    3.新建一个视图,同一个文件有不同的视图,或许会满足你的需要。
      

  4.   

    非常谢谢xiaoqiqixiao(七七) !我参考《突破Visual C++.NET编程实例五十讲》第1篇第7讲实现了,代码如下,只是还没有完全明白其过程:    CDocument *pDoc = NULL;
        POSITION pos = Application.GetFirstDocTemplatePosition();
        ASSERT(pos != NULL);
        CDocTemplate *pTemplate = Application.GetNextDocTemplate(pos);
        pTemplate->OpenDocumentFile(pszFileName);
        
        pos = pTemplate->GetFirstDocPosition();
        if (pos != NULL ) pDoc = pTemplate->GetNextDoc(pos);    return pDoc;
      

  5.   

    http://www.codeproject.com/docview/MultiViewsMFC_MDI.asp
      

  6.   

    没必要打开,不表示不能打开,请参考以下源代码,和本人的注释
    CDocument* CWinApp::OpenDocumentFile(LPCTSTR lpszFileName)
    {
    ASSERT(m_pDocManager != NULL);
    return m_pDocManager->OpenDocumentFile(lpszFileName);
    }
    CDocument* CDocManager::OpenDocumentFile(LPCTSTR lpszFileName)
    {
    // find the highest confidence
    POSITION pos = m_templateList.GetHeadPosition();
    CDocTemplate::Confidence bestMatch = CDocTemplate::noAttempt;
    CDocTemplate* pBestTemplate = NULL;
    CDocument* pOpenDocument = NULL; TCHAR szPath[_MAX_PATH];
    ASSERT(lstrlen(lpszFileName) < _countof(szPath));
    TCHAR szTemp[_MAX_PATH];
    if (lpszFileName[0] == '\"')
    ++lpszFileName;
    lstrcpyn(szTemp, lpszFileName, _MAX_PATH);
    LPTSTR lpszLast = _tcsrchr(szTemp, '\"');
    if (lpszLast != NULL)
    *lpszLast = 0;
    AfxFullPath(szPath, szTemp);
    TCHAR szLinkName[_MAX_PATH];
    if (AfxResolveShortcut(AfxGetMainWnd(), szPath, szLinkName, _MAX_PATH))
    lstrcpy(szPath, szLinkName);//先搜索是否有相同文件名的已打开的文档
    while (pos != NULL)
    {
    CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
    ASSERT_KINDOF(CDocTemplate, pTemplate); CDocTemplate::Confidence match;
    ASSERT(pOpenDocument == NULL);
    //请注意此处MatchDocType即是判断是否有打开的文件以及找到最适当的CDocTemplate,如果你想//的话,你也可以自己看看MatchDocType是怎么编的。
    match = pTemplate->MatchDocType(szPath, pOpenDocument);
    if (match > bestMatch)
    {
    bestMatch = match;
    pBestTemplate = pTemplate;
    }
    if (match == CDocTemplate::yesAlreadyOpen)
    break;      // stop here
    }//如果有找到已经打开的文档的话,就将该文档调到前台
    if (pOpenDocument != NULL)
    {
    POSITION pos = pOpenDocument->GetFirstViewPosition();
    if (pos != NULL)
    {
    CView* pView = pOpenDocument->GetNextView(pos); // get first one
    ASSERT_VALID(pView);
    CFrameWnd* pFrame = pView->GetParentFrame();
    if (pFrame != NULL)
    pFrame->ActivateFrame();
    else
    TRACE0("Error: Can not find a frame for document to activate.\n");
    CFrameWnd* pAppFrame;
    if (pFrame != (pAppFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd))
    {
    ASSERT_KINDOF(CFrameWnd, pAppFrame);
    pAppFrame->ActivateFrame();
    }
    }
    else
    {
    TRACE0("Error: Can not find a view for document to activate.\n");
    }
    return pOpenDocument;
    } if (pBestTemplate == NULL)
    {
    AfxMessageBox(AFX_IDP_FAILED_TO_OPEN_DOC);
    return NULL;
    }//最后调用所选的CDocTemplate打开你的文档,至于CDocTemplate怎么打开你的文档,请自已继续
    return pBestTemplate->OpenDocumentFile(szPath);
    }
      

  7.   

    非常谢谢xiaoqiqixiao(七七) !有问题继续向你请教。