Почему CMFCMenuBar не использует таблицу ускорителей?

В проекте doc/view, использующем VS2008, MFCMenuBar, кажется, загружает правильный ресурс MENU (IDR_MAINFRAME) из проекта, поскольку добавление и удаление пунктов меню отражается в пользовательском интерфейсе меню. Он даже добавляет ускорители к элементам меню по умолчанию (например, Ctrl+O к элементу Open...). Однако таблица акселераторов (IDR_MAINFRAME), похоже, не связана с меню. Изменение Ctrl+O по умолчанию для Open... на что-то вроде Ctrl+7 не работает. Ctrl+O по-прежнему добавляется к элементу меню Open..., а Ctrl+O по-прежнему вызывает обработчик Open.... В файле ресурсов есть только одна таблица ускорителей, поэтому я понятия не имею, откуда CMFCMenuBar получает информацию об ускорителе.

К этому моменту я смог заставить ускорители работать, вручную загрузив таблицу ускорителей IDR_MAINFRAME и сам переводя сообщения. Но CMFCMenuBar все еще добавляет ускорители по умолчанию.

Кто-нибудь может объяснить, что здесь происходит? Как я могу заставить MFCMenuBar использовать мою таблицу ускорителей и либо не добавлять ускорители, либо добавлять правильные ускорители?

2 ответа

Просто потратив слишком много времени на борьбу с этой проблемой, я решил опубликовать решение, которое, похоже, работает для меня.

Я звоню:

theApp.GetKeyboardManager()->ResetAll();

после того, как содержимое MDI-фреймворка было загружено из реестра (я создал специальную функцию с именем PostLoadFrame(), которую я вызываю сразу после вызова LoadFrame (), где реестр, кажется, получает чтение).

Этот вызов функции игнорирует любые ускорители, загруженные из реестра (что хорошо для меня, потому что я все равно не разрешаю их настраивать), и вместо этого использует ускорители в файле ресурсов.

Как я уже сказал, мне кажется, это работает в моем приложении. Если вы разрешите настройку клавиш акселератора, то, похоже, можно объединить файл ресурсов и сохраненные в реестре значения с другими функциями в CKeyboardManager, но это немного сложнее.

Я надеюсь, что это поможет кому-то сэкономить время, которое я потерял!!

Видимо, некоторые настройки CMFCMenuBar сохраняются в реестре (я думаю, HKCU). Попробуйте очистить параметры реестра вашего приложения и посмотрите, отображаются ли правильные ускорители.

Посмотрите эту ветку MSDN для устранения неполадок, связанных с CMFCMenuBar.

Другие вопросы по тегам