2009-08-17 1 views
2

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

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

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

ответ

6

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

См. Это MSDN thread для некоторых связанных с устранением неисправностей CMFCMenuBar.

+0

У меня была такая же проблема с CDockablePane, которая не использовала недавно обновленную таблицу ускорителей. Устранение проблемы HKCU \ Software \ \ . Я думаю, что то же самое поможет CMFCMenuBar. – 2010-02-01 14:37:00

+0

это немного кувалдой. Опция выше с ResetAll() лучше. –

12

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

Я называю:

theApp.GetKeyboardManager()->ResetAll();

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

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

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

Надеюсь, что кто-то поможет где-то сохранить часть времени, которое я потерял!

Смежные вопросы