如何在CMFCRibbonBar中更新最近文件列表
How to update Recent File List in the CMFCRibbonBar
我们已经用CMFCRibbonBar代替了vc++ VS2010的菜单应用程序。在旧的菜单驱动版本中,我们已经创建了自己的用户定义类,派生自CRecentFileList。我们覆盖了uoddatemenu方法,以便从Recent File List中添加和删除文件。现在我们正在使用CMFCRibbonBar,我们在功能区中更新Recent Files列表时遇到了问题。每次我们打开另一个文件时,MRU列表都会正确更新,但功能区中的Recent file列表保持不变。如果我们关闭应用程序,然后重新打开它,最近的文件列表被正确更新。任何帮助都将非常感激。谢谢你。
当您使用自己的CRecentFileList
派生类时,有一种可能是对MFC的更改影响了它的调用方式-特别是如果您在项目中更改了WINVER
定义。
功能区栏不做任何超过路由命令文件/打开和文件/保存通过MFC框架,在每种情况下,他们最终在CWinApp::AddToRecentFileList()
的某个点,这是什么做的行为。
现在,在早期版本的MFC(例如VS2008)中,该函数定义如下:
void CWinApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
ASSERT_VALID(this);
ENSURE_ARG(lpszPathName != NULL);
ASSERT(AfxIsValidString(lpszPathName));
if (m_pRecentFileList != NULL)
m_pRecentFileList->Add(lpszPathName);
}
然而,从(我认为)VS2010开始-当然在VS2012中-该函数现在看起来像这样:
void CWinApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
ASSERT_VALID(this);
ENSURE_ARG(lpszPathName != NULL);
ASSERT(AfxIsValidString(lpszPathName));
if (m_pRecentFileList != NULL)
{
#if (WINVER >= 0x0601)
m_pRecentFileList->Add(lpszPathName, m_pszAppID);
#else
m_pRecentFileList->Add(lpszPathName);
#endif
}
}
您可以看到CRecentFileList::Add()
有一个新的过载,它可能会影响派生类中的逻辑。如果你用调试器进入新代码,你可以看到它正在使用Windows 7 shell API调用来将最近的文档添加到跳转列表(以及其他事情),这可能是你无论如何都想要做的。
在任何情况下,正如您发现重新加载应用程序正确显示更新的列表一样,我认为只有在列表更改后才需要重新加载列表。为此,您可以重写CWinApp::AddToRecentFileList()
,如下所示:
void CYourApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
CWinApp::AddToRecentFileList(lpszPathName);
m_pRecentFileList->ReadList();
}
看看是否有帮助
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- C++如何获取文件最近更改的时间戳
- 如何在 MFC 中获取最近文件的列表
- 从文本文件中删除最近添加的行
- 如何在CMFCRibbonBar中更新最近文件列表
- 处理大数据网络文件的高效算法,用于计算n个最近节点