Как обновить Список последних файлов в CMFCRibbonBar

Мы заменили приложение меню VC ++ VS2010 на CMFCRibbonBar. В более старой версии, управляемой меню, мы создали собственный определяемый пользователем класс, производный от CRecentFileList. Мы переопределили метод UodateMenu для добавления и удаления файлов из списка последних файлов. Теперь, когда мы используем CMFCRibbonBar, у нас возникают проблемы с обновлением списка последних файлов на ленте. список MRU корректно обновляется каждый раз, когда мы открываем другой файл, но список последних файлов на ленте остается прежним. Если мы закроем приложение, а затем снова откроем его, список последних файлов обновляется должным образом. Любая помощь будет чрезвычайно ценится. Спасибо.

0

Решение

Как вы использовали свой собственный производный класс от CRecentFileListесть одна возможность, что изменения в MFC повлияли на то, как он называется — в частности, если вы изменили WINVER определение в вашем проекте.

Ленточная панель не делает ничего, кроме маршрутизации команд для File / Open и File / Save через инфраструктуру 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() что может повлиять на логику в вашем производном классе. Если вы войдете в этот новый код с помощью отладчика, вы увидите, что он использует вызовы API оболочки Windows 7 для добавления последних документов в список переходов (среди прочего), что вы можете захотеть сделать в любом случае.

В любом случае, поскольку вы обнаружили, что при перезагрузке приложения правильно отображается обновленный список, я думаю, что будет необходимо перезагрузить список самостоятельно после его изменения. Для этого вы можете переопределить CWinApp::AddToRecentFileList() следующее:

void CYourApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
CWinApp::AddToRecentFileList(lpszPathName);
m_pRecentFileList->ReadList();
}

Посмотрите, поможет ли это.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]