Почему 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.