2015-01-19 5 views
7

Я пытаюсь отключить/серые элементы меню с помощью метода CMenu::EnableMenuItem().Почему я не могу отключить/отключить меню? (MFC)

У меня есть переменная 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_COMMAND, и этот элемент будет ссылаться на функцию, получающую объект CCmdUi, который вы можете изменить в соответствии с вашими потребностями. Но поскольку вы используете MFC, вы обычно не делаете этого вручную, но просто используйте свойства окон, содержащих меню.

+0

Я понимаю, что вы говорите, но это не совсем то, что я пытаюсь сделать. Я не пытаюсь включить/отключить элементы с приложением. Я вызываю все эти методы во внешнем приложении. – Amre

+2

Вы окончательно не сможете это сделать! Вместо этого вы должны отправлять специальные сообщения в приложение MFC, сообщая ему, что некоторые пункты меню должны быть серыми. А затем в приложении MFC вы сможете использовать обработчик ON_UPDATE_COMMAND_UI для их включения/выключения. Я не могу представить другого способа для приложения MFC. –

+0

Есть ли способ вызвать oncommand или обработчик сообщений Bn_clicked, если я знаю идентификатор элемента меню? Я пробовал использовать sendmessage и postmessage, проходящие в дескрипторе главного окна и BN_CLICKED и WM_COMMAND, но это не работает. – Amre

7

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

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

+0

Проблема в том, что я делаю все это из внешнего приложения. Я использую дескриптор главного окна, чтобы получить его меню, затем я использую GetSubMenu, чтобы получить его подменю, у меня нет доступа к объекту CCmdUI. – Amre

+0

@ А вы тогда застряли. Приложение, которое вы пытаетесь контролировать, постоянно восстанавливает включенное/отключенное состояние через свой собственный объект CCmdUI, и любое изменение, которое вы сделаете, будет отменено в миллисекундах. –

+0

По существу, что я пытаюсь выполнить с этим, посылает сообщение oncommand на кнопку.Я пытаюсь создать приложение, которое я могу использовать для проверки безопасности моего приложения, против того, кто отправляет сообщение oncommand или bn_clicked в элемент управления и получает доступ к тому, что им не требуется. – Amre