Почему я не могу отключить / выделить меню серым? (МФЦ)

Я пытаюсь отключить / затемнить пункты меню, используя CMenu::EnableMenuItem() метод.

у меня есть CMenu* переменная pMenu который ссылается на верхнее меню диалога. Я могу получить подменю, используя pMenu->GetSubMenu(int) и используя submenu->GetMenuStringA(), проверьте названия подменю / пунктов меню, которые я получаю. У меня проблемы с EnableMenuItem() метод хотя. Скажем, есть File меню. Внутри него есть New а также Open всплывающие меню и Import, Close, а также Close All Пункты меню. New а также Open есть пункты подменю. (например New->Document) С помощью submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED); Я могу отключить New или же OpenОднако функция не работает для Import, Close а также Close All, а также все пункты меню с New а также Open,

Примечание: когда я говорю EnableMenuItem() не получается, я не имею в виду, что он возвращает -1. Возвращает предыдущий статус, но меню не становится отключенным или недоступным.

В документации MSDN для EnableMenuItem(): http://msdn.microsoft.com/en-us/library/h62wh3y1.aspx утверждает, что это будет работать как для всплывающих, так и для стандартных пунктов меню. Хотя, кажется, это работает только для всплывающих окон.

2 ответа

Решение

Заявление ScottMcP-MVP MFC выполняет настройку меню в обработчике ON_UPDATE_COMMAND_UI: когда пользователь вашего приложения закрывает меню, каждый элемент меню должен знать, должно ли оно отображаться как включенное или отключенное. Цель команды меню предоставляет эту информацию путем реализации обработчика ON_UPDATE_COMMAND_UI. Для каждого из объектов пользовательского интерфейса команды в вашем приложении используйте окно "Свойства", чтобы создать запись карты сообщений и прототип функции для каждого обработчика.

Когда меню закрывается, платформа ищет и вызывает каждый обработчик ON_UPDATE_COMMAND_UI, каждый обработчик вызывает функции-члены CCmdUI, такие как Enable и Check, и платформа соответствующим образом отображает каждый пункт меню.

Это означает, что вы должны хранить в своих собственных классах ожидаемое состояние для пункта меню, который может быть отмечен / не отмечен. Вы должны будете поставить один ON_UPDATE_COMMAND_UI макрос для элемента меню рядом с ON_COMMAND макрос, и этот элемент будет ссылаться на функцию, получающую объект CCmdUi, который вы можете изменить в соответствии со своими потребностями. Но так как вы используете MFC, вы обычно не делаете это вручную, а просто используете свойства окон, содержащих меню.

У MFC есть другая схема для включения / выключения пунктов меню, и эта схема отменяет то, что вы делаете. Для работы в схеме MFC вы добавляете обработчики сообщений ON_UPDATE_CMD_UI, как описано здесь:

http://msdn.microsoft.com/en-us/library/6kc4d8fh.aspx

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