我建立了一个单文档视图结构的工程,并且实现了保存文档数据和打开文档数据的功能,其实就是实现了文档派生类中的Serialize(CArchive& ar)函数,可是现在的情况是这样:当建立了文档1和文档2后(里面都有各自的数据,并且保存在硬盘上),现在打开文档1,并且修改文档1后(没有保存修改),如果打开文档2,则会提示是否保存文档1,选是或者否后,会执行相应的操作,并且打开文档2,可是如果选择打开的还是文档1的话,则不会有任何提示,也不会执行Serialize(CArchive& ar)函数,显示的内容还是修改后文档1,而没有从硬盘重新读取文档1,其实office word的处理也是这样的。可以按照我说的步骤体会一下!我的程序其实也没有错误。
现在我想改变一下这种方式,如果在修改文档1后,又从硬盘打开原来的文档1,则提示是否用原来的文档1覆盖修改后的,如果选择是,则打开原来的文档1,选择否,则不打开原来的文档,其他的操作不变!我不知道应该怎麽修改,应该重写那些函数?应该怎麽改?请高手帮我实现一下!

解决方案 »

  1.   

    单文档一次只能有一个文档,当打开另一个时前一个DOC就会关闭。这是MFC内建的逻辑。修改这个逻辑建议新建一个命令,不要改动内建的逻辑。
    一定要改的话,用debug方式来跟踪OnFileOpen(..),应该是CApp中的吧。我以前也是要改动内部,发现问题不断,很花时间。
      

  2.   

    void CSingleDOCApp::OnFileOpen() 
    {
        CString newName;
        if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
    OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
    return; // open cancelled
        POSITION pos = GetFirstDocTemplatePosition();
        CDocTemplate* pTemplate = GetNextDocTemplate(pos);
        CDocument* pOpenDocument = NULL;    if (pTemplate->MatchDocType(newName, pOpenDocument) == CDocTemplate::yesAlreadyOpen)
        {
    if (((((CFrameWnd*) AfxGetApp()->m_pMainWnd))->GetActiveDocument())->IsModified())
    {
    if (AfxMessageBox("Do you want to replace current content?", MB_YESNO) == IDNO)
    {
    return;
    }
    ((((CFrameWnd*) AfxGetApp()->m_pMainWnd))->GetActiveDocument())->SetModifiedFlag(false);
    }    }    pTemplate->OpenDocumentFile(newName);
    }