我希望用户能够编辑我的MFC应用程序的“文件”菜单中显示的最近文件数。我使用了两个非常好的参考文献:
它涉及删除并重新创建CRecentFileList
中存储的CWinApp::m_pRecentFileList
对象。不幸的是,我发现更换CRecentFileList
后菜单没有正确更新。请参阅下面的代码段:
void CMyWinApp::SetMRUListSize( int size )
{
// size guaranteed to be between 1 and 16
delete m_pRecentFileList ;
LoadStdProfileSettings( size ) ;
}
在重新创建对象后,我该怎么做才能确保将“文件”菜单中的内容与m_pRecentFileList
同步?
答案 0 :(得分:2)
我的CApp来自CWinApp。在initInstance中,您有以下这一行:
LoadStdProfileSettings(10);
在InitInstance结束时,添加以下代码:
m_pmf->m_pRecentFileList = m_pRecentFileList;
这里m_pmf是我的MainFrame类,我创建了一个类型为CRecentFileList的成员CMainFrame :: m_pRecentFileList,它位于MFC源文件filelist.cpp中。右边的m_pRecentFileList受到保护,CMainFrame无法从InitInstance外部访问它,但你可以在这里制作一个功能副本。
在CMainFrame :: OnClose结束时,强制执行注册表更新:
m_pRecentFileList->WriteList();
//退出时强制注册表更新。如果没有强制,这不起作用。
我甚至不必重建m_pRecentFileList,MRU机制正确更新它。示例:5个MRU项目,第一个被移动到另一个目录,无法再找到。单步执行调试器中的代码会显示错误条目已从列表中删除。由于某种原因,更新列表未正确保存,除非我如上所述强制它。我原本以为问题可能与权限(64位Win7)有关,但是以管理员身份运行应用程序并没有帮助。
答案 1 :(得分:0)
Some of Microsoft's documentation建议您从CWinApp::LoadStdProfileSettings
内拨打InitInstance
。这告诉我,它是在初始化期间而不是在运行时完成的。
您是否尝试过全面实施您提供的两个链接中的第二个?我的猜测是你需要添加第二部分而不是调用CWinApp::LoadStdProfileSettings
:
m_pRecentFileList = new CRecentFileList(0, strSection, strEntryFormat, nCount);
if(m_pRecentFileList)
{
bReturn = TRUE;
// Reload list of MRU files from registry
m_pRecentFileList->ReadList();
}
[修改] 显然m_pRecentFileList
指向CRecentFileList Class 。您是否尝试过调用CRecentFileList::UpdateMenu?