mfc单文档应用程序 打开文件操作默认的消息响应函数在哪个地方

2025-05-01 07:42:10
推荐回答(2个)
回答1:

在MFC框架代码中,不在你自己的程序里面。

MFC对很多默认操作做了层层封装,单就打开文件来说,如果你自己不实现响应函数,那么文档模板类会产生一个默认操作,对应单/多文档,会有不同的响应(新建还是重载当前),包括OLE拖拽、命令行参数(这个是在CWinApp中),都有打开文件的相关调用。

但总归最后,打开代码在文档类的基类CDocument 中,这个是开源的,代码如下:

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;
}

回答2:

这个函数系统写好的,一般我们也不需要改写,你可以查看菜单中Open项的ID(好像是IDR_FILE_OPEN),然后全局搜索这个ID看能不能找到想关联的相应函数吧