CDocument::OnOpenDocument

来源:互联网 发布:淘宝上的宠物用品货源 编辑:程序博客网 时间:2024/04/30 18:23

当用户在界面上选择文件菜单/打开文件(ID_FILE_OPEN)时,CWinApp派生类的OnFileOpen函数被自动调用,它通过文档模板创建(MDI)/重用(SDI)框架、文档和视图对象,并最终调用CDocument::OnOpenDocument来读文件,CDocument::OnOpenDocument 的处理流程如下:

     BOOL CDocument::OnOpenDocument(LPCTSTR lpszPathName)
        {
            if (IsModified())
        TRACE0("Warning: OnOpenDocument replaces an unsaved document./n");
       
        CFileException fe;
        CFile* pFile = GetFile(lpszPathName,
        CFile::modeRead|CFile::shareDenyWrite, &fe);
        if (pFile == NULL)
        {
        ReportSaveLoadException(lpszPathName, &fe,
        FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
        return FALSE;
        }
       
        DeleteContents();
        SetModifiedFlag();  // dirty during de-serialize
       
        CArchive loadArchive(pFile, CArchive::load | CArchive::bNoFlushOnDelete);
        loadArchive.m_pDocument = this;
        loadArchive.m_bForceFlat = FALSE;
        TRY
        {
        CWaitCursor wait;
        if (pFile->GetLength() != 0)
        Serialize(loadArchive);     // load me
        loadArchive.Close();
        ReleaseFile(pFile, FALSE);
        }
        CATCH_ALL(e)
        {
        ReleaseFile(pFile, TRUE);
        DeleteContents();   // remove failed contents
       
        TRY
        {
        ReportSaveLoadException(lpszPathName, e,
        FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
        }
        END_TRY
        DELETE_EXCEPTION(e);
        return FALSE;
        }
        END_CATCH_ALL
       
        SetModifiedFlag(FALSE);     // start off with unmodified
       
        return TRUE;
        }