Обработка состояния пользовательского интерфейса - PullRequest
4 голосов
/ 01 марта 2009

У меня есть приложение, работающее в Windows, написанное с использованием MFC. Состояние включения / выключения пунктов меню зависит от множества условий. Например, я должен включить пункт меню, если условие А выполнено ИЛИ, если условие Б выполнено, но должно быть отключено, если оба А и В ИСТИНА одновременно. Как мы смоделируем это в коде? Я думаю, что должен использовать какой-то конечный автомат, но мой конечный автомат содержит слишком много состояний Каков общий способ решения таких проблем? Пожалуйста, обратите внимание, что вышеприведенное было только примером, таких условий будет намного больше. Кроме того, возможность всегда держать меню включенным и отображать сообщение об ошибке, когда пользователь нажимает его, не существует, так как я должен отключить меню.

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

Ответы [ 2 ]

0 голосов
/ 01 марта 2009

MFC имеет встроенный механизм для включения и отключения пунктов меню в форме маршрутизации команд и макроса ON_UPDATE_COMMAND_UI. Подробнее см. Как: обновить объекты интерфейса пользователя и документацию класса CCmdUI в MSDN.

Вам не обязательно нужен конечный автомат. Для каждой команды меню определите, где команда должна обрабатываться, например, в вашем документе, представлении или классе основного фрейма, затем реализуйте обработчик OnUpdate и добавьте запись карты сообщений ON_UPDATE_COMMAND_UI для соответствующего класса.

В качестве примера рассмотрим ответ, который я дал на этот вопрос .

0 голосов
/ 01 марта 2009

Попробуйте написать метод, updateUIStatus(), который вызывается после каждого действия пользовательского интерфейса. Этот метод установит включенное или отключенное состояние пункта меню (и любого другого компонента пользовательского интерфейса) в зависимости от ваших условий.

Хорошая особенность наличия единственного метода для выполнения всех обновлений состояния пользовательского интерфейса состоит в том, что вы централизуете всю эту логику в одном месте, вместо нескольких вызовов, скажем, if (condition A && condition B) menu.setEnabled(true);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...