Почему я не могу отключить / выделить меню серым? (МФЦ)
Я пытаюсь отключить / затемнить пункты меню, используя 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, как описано здесь: