我希望用户能够编辑MFC应用程序的"file"菜单中显示的最新文件数。我使用了两个很好的引用:

  • http://www.codeproject.com/KB/menus/changemru.aspx
  • http://www.microsoft.com/msj/0899/c/c0899.aspx

  • 它涉及删除并重新创建存储在CRecentFileList中的CWinApp::m_pRecentFileList对象。不幸的是,我发现替换CRecentFileList后菜单没有正确更新。请参见下面的代码段:
    void CMyWinApp::SetMRUListSize( int size )
    {
       // size guaranteed to be between 1 and 16
       delete m_pRecentFileList ;
       LoadStdProfileSettings( size ) ;
    }
    

    重新创建对象后,我该怎么做才能确保"file"菜单中绘制的内容与m_pRecentFileList同步?

    最佳答案

    我的CApp源自CWinApp。在initInstance中,您具有以下这一行:

    LoadStdProfileSettings(10);
    

    在InitInstance的末尾,添加以下代码:
    m_pmf->m_pRecentFileList = m_pRecentFileList;
    

    这里m_pmf是我的MainFrame类,我创建了一个CRecentFileList类型的成员CMainFrame::m_pRecentFileList,它位于MFC源文件filelist.cpp中。右边的m_pRecentFileList protected ,CMainFrame无法从InitInstance外部访问它,但是您可以在此处进行功能复制。

    在CMainFrame::OnClose的末尾,通过以下方式强制更新注册表:
               m_pRecentFileList->WriteList();
    

    //强制退出时更新注册表。如果没有强制,这是行不通的。

    我什至不必重建m_pRecentFileList,MRU机制可以正确更新它。示例:5个MRU项,第一个被移动到另一个目录,无法再找到。单步执行调试器中的代码显示该错误条目已从列表中删除。由于某些原因,除非我按照上面的说明强制执行,否则无法正确保存更新后的列表。我本来以为问题可能与特权(64位Win7)有关,但以管理员身份运行该应用程序无济于事。

    10-08 12:02