Изменение общего количества последних файлов
Я бы хотел, чтобы пользователь мог редактировать количество последних файлов, отображаемых в меню "Файл" моего приложения 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
после того, как я воссоздаю объект?
2 ответа
Мой CApp происходит от CWinApp. В initInstance у вас есть эта строка:
LoadStdProfileSettings(10);
В конце InitInstance добавьте этот код:
m_pmf->m_pRecentFileList = m_pRecentFileList;
Здесь m_pmf - это мой класс MainFrame, и я создал член CMainFrame::m_pRecentFileList типа CRecentFileList, который находится в исходном файле MFC filelist.cpp. Справа m_pRecentFileList защищен, и CMainFrame не имеет доступа к нему извне InitInstance, но вы можете сделать функциональную копию здесь.
В конце CMainFrame::OnClose принудительно обновите реестр:
m_pRecentFileList->WriteList();
// Принудительное обновление реестра при выходе. Это не работает без принуждения.
Мне даже не нужно перестраивать m_pRecentFileList, механизм MRU корректно обновляет его. Пример: 5 элементов MRU, первый перемещен в другой каталог и больше не может быть найден. Выполнение кода в отладчике показывает, что неверная запись удаляется из списка. По какой-то причине обновленный список не сохраняется правильно, если я не заставлю его, как описано выше. Первоначально я думал, что проблема может быть связана с привилегиями (64-битная Win7), но запуск приложения от имени администратора не помог.
Некоторые документы Microsoft предлагают вам позвонить 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. Вы пытались вызвать CRecentFileList:: UpdateMenu?
Есть еще один пример CodeProject, который тоже может помочь.