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

Я пытаюсь отключить / затемнить пункты меню, используя 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 он утверждает, что это будет работать как для всплывающих, так и для стандартных пунктов меню. Хотя, похоже, это работает только для всплывающих окон.

7

Решение

Заявленный 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, вы обычно этого не делаете рукой но просто используйте свойства окон, содержащих меню.

2

Другие решения

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

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

7

По вопросам рекламы [email protected]