Я пытаюсь отключить / затемнить пункты меню, используя 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 он утверждает, что это будет работать как для всплывающих, так и для стандартных пунктов меню. Хотя, похоже, это работает только для всплывающих окон.
Заявленный ScottMcP-MVP MFC выполняет настройку меню в обработчике ON_UPDATE_COMMAND_UI: Когда пользователь вашего приложения закрывает меню, каждый элемент меню должен знать, должен ли он отображаться как включенный или отключенный. Цель команды меню предоставляет эту информацию путем реализации обработчика ON_UPDATE_COMMAND_UI. Для каждого из объектов пользовательского интерфейса команды в вашем приложении используйте окно «Свойства», чтобы создать запись карты сообщений и прототип функции для каждого обработчика.
Когда меню закрывается, платформа ищет и вызывает каждый обработчик ON_UPDATE_COMMAND_UI, каждый обработчик вызывает функции-члены CCmdUI, такие как Enable и Check, и затем платформа соответствующим образом отображает каждый элемент меню.
Это означает, что вы должны хранить в своих собственных классах ожидаемое состояние для пункта меню, который может быть отмечен / не отмечен. Вы должны будете поставить один ON_UPDATE_COMMAND_UI
макрос для элемента меню рядом с ON_COMMAND
macro, и этот элемент будет ссылаться на функцию, получающую объект CCmdUi, который вы можете изменить в соответствии со своими потребностями. Но так как вы используете MFC, вы обычно этого не делаете рукой но просто используйте свойства окон, содержащих меню.
У MFC есть другая схема для включения / выключения пунктов меню, и эта схема отменяет то, что вы делаете. Для работы в схеме MFC вы добавляете обработчики сообщений ON_UPDATE_CMD_UI, как описано здесь:
http://msdn.microsoft.com/en-us/library/6kc4d8fh.aspx