Изменение общего количества последних файлов - PullRequest
1 голос
/ 28 мая 2009

Я бы хотел, чтобы пользователь мог редактировать количество последних файлов, отображаемых в меню «Файл» моего приложения 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 ]

2 голосов
/ 03 ноября 2012

Мой 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), но запуск приложения с правами администратора не помог.

0 голосов
/ 28 мая 2009

В некоторых документах 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 Class . Вы пытались вызвать CRecentFileList :: UpdateMenu ?

Есть другой пример CodeProject, который также может помочь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...