MFC中recent菜单部分是如何封装的?我想修改修改。

解决方案 »

  1.   

    看MFC的源码吧,方法如下:
    把c:\program files\microsoft visual studio\VC 目录下的所有文件复制到另外一个目录中
    新建一个 Win32 Application的空工程,把 include 和 MFC 目录下的所有源码都添加到工程中去
      

  2.   

    MRU(最近使用的)文件
    问:我想将最近使用过的几个文件名(以及路径)显示出来,该怎么办?
    答:一个由向导生成器生成的文档视图结图已经包含MRU列表操作.具体是放在注
    册表的 HKEY_CURRENT_USER/Software/Your Company Name/Your App Name/Recent File List/File1, File2, File3, etc.
        你所要做的是用程序中的GetProfileString()读入第一个MRU文件的位置,
    剩下的由 CRecentFileList::ReadList()完成所有的工作.CRecentFileList类
    包含了所有操作 的代码象分析路径,管理MRU文件等,用不着为此费心.
        2)在AFXWIN.H中定义了一个变量CRecentFileList* m_pRecentFileList; 
    你可以通过使用CRecentFileList的成员变量m_arrNames[n]来取得某个MRU文件.
    比如:#include 
                     // needed for access to MRU listCfile mruFile;
    if ( !mruFile.Open( m_pRecentFileList->m_arrNames[index],
                             Cfile::modeRead )
    ....
        3)你不需要建立一个CRecentFileList类,它已经由CWinApp基类完成了.你
    只要保证你在 initinstance中调用LoadStdProfileSettings()函数就可以了. CRecentFileList类中有一个CWinApp保护成员变量
    (如m_pRecentFileList) 所以你应该在你的继承类中处理它.下面的代码在
    我这儿工作很正常void CMdiApp::OnFileMruFile1()
    {
        // TODO: Add your command handler code here
        Cstring vl_name ;
                ASSERT( m_pRecentFileList->GetSize() > 0);
        vl_name = (*m_pRecentFileList)[0];
        CWinApp::OnOpenRecentFile(ID_FILE_MRU_FILE1);
    }
    OnOpenRecentFile()函数必须要调用缺省处理,其它的就随便了
      

  3.   

    如何重载MRU文件?
     我创建了一个应用程序可以载入图象文件,但当我点击FILE菜单下MRU文件列表
    时,却不能从磁盘载入以前曾经打开过的文件.下面是我所能想到的解决方案:
    (1)在文档类中定义一个成员函数(例如:CMyDoc::Reopen)来处理重新打开这个问
    题,指明参数和返回值.
    (2)产生一个CMultiDocTemplate的继承类(如CMyDocTemplate),定义一个构造函
    数,取和基类相同的参数,不做任何事,只是调用基类的构造函数.
    (3)重载MatchDocType:
    CMyDocTemplate::Confidence CMyDocTemplate::MatchDocType(
        LPCTSTR lpszPath,
        CDocument *&rpDocMatch
        )
    {
        Confidence match = CMultiDocTemplate::MatchDocType(lpszPath, rpDocMatch);    if(yesAlreadyOpen == match) // clear enough
        {
            ASSERT_KINDOF(CMyDoc, rpDocMatch);
            ((CMyDoc *) rpDocMatch)->Reopen(/* your parameters */);        // you can take any other actions here...
        }    return match;
    }
    当这个函数返回"yesAlreadyOpen"时,你的文档框架将会被激活.
      

  4.   

    我的多文档程序中有一个是没有doc/view结构的,我想让他出现在recent的地方,就必须改写recent部分代码。
    还有我想做成CodeWarrior的recent样式,就是工程文件和代码文件之间用一个-分割开,我想应该不是太难,谁可以给点建议,我还不想自己实现一个recent菜单,那样代码太多了,还有考虑管理,麻烦。
      

  5.   

    在“C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp”文件中有如下两行:
    ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
    ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)所以,当用户选择文件菜单中MRU列表项时,会调用WinApp::OpenDocumentFile,进而调用CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile函数。
    而在CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile中一定会有类似的如下两条语句:
    pDocument->OnOpenDocument(lpszPathName);
    pDocument->SetPathName(lpszPathName);其中第一条语句调用CDocument::OnOpenDocument,所以如果你要实现你自己的打开操作,比如打开图片文件、视频文件等,那么你可以在你自己的文档类中重写OnNewDocument函数,如下所示:
    BOOL CXxxDoc::OnOpenDocument(LPCTSTR lpszPathName)
    {
      if (!CDocument::OnOpenDocument(lpszPathName))
        return FALSE;  //应该在这里打开文档的!
      AfxMessageBox("在这里打开文档! ", MB_ICONINFORMATION + MB_OK);  return TRUE;
    }其中第二条语句调用CDocument::SetPathName,由它实现:取完整路径、设置文档标题、添加菜单MRU列表项等功能,类似这样:
    void CDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
    {
      //...  //添加MRU列表项
      if (bAddToMRU)
        AfxGetApp()->AddToRecentFileList(m_strPathName);  //...
    }
      

  6.   

    再看一下这两行:
    ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
    ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)实现自己的MRU列表的难处可能在于第一行,标准的CWinApp::OnUpdateRecentFileMenu函数中有这样的语句:
    m_pRecentFileList->UpdateMenu(pCmdUI);由CRecentFileList::UpdateMenu函数用来更新菜单中的MRU文件列表项,不幸的这是一个非常复杂的函数,不易改写。
      

  7.   

    全文整理如下:
    一、
    在“C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp”文件中有如下两行:
    ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
    ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)我们先看这二行,因为它,当用户选择文件菜单中MRU列表项时,会调用WinApp::OnOpenRecentFile,其中调用WinApp::OpenDocumentFile,进而调用CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile函数。
    而在CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile中一定会有类似的如下两条语句:
    pDocument->OnOpenDocument(lpszPathName);    --- 第一条语句
    pDocument->SetPathName(lpszPathName);       --- 第二条语句其中第一条语句调用CDocument::OnOpenDocument,所以如果你要实现你自己的打开操作,比如打开图片文件、视频文件等,那么你可以在你自己的文档类中重写OnOpenDocument函数,如下所示:
    BOOL CXxxDoc::OnOpenDocument(LPCTSTR lpszPathName)
    {
      if (!CDocument::OnOpenDocument(lpszPathName))
        return FALSE;  //应该在这里打开文档的!
      AfxMessageBox("在这里打开文档! ", MB_ICONINFORMATION + MB_OK);  return TRUE;
    }其中第二条语句调用CDocument::SetPathName,由它实现:取完整路径、设置文档标题、添加菜单MRU列表项等功能,类似这样:
    void CDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
    {
      //...  //添加MRU列表项
      if (bAddToMRU)
        AfxGetApp()->AddToRecentFileList(m_strPathName);  //...
    }
    二、
    再看一下这两行:
    ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
    ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)实现自己的MRU列表的难处可能在于第一行,标准的CWinApp::OnUpdateRecentFileMenu函数中有这样的语句:
    m_pRecentFileList->UpdateMenu(pCmdUI);CRecentFileList::UpdateMenu函数用来更新菜单中的MRU文件列表项,不幸的这是一个非常复杂的函数,不易改写