Глава 20. Обновление пользовательского интерфейса
В
MFC реализован специальный механизм для обновления таких объектов интерфейса пользователя , как меню, панели управления и панели состояния. Этот механизм предусматривает передачу приложению команд обновления пользовательского интерфейса ( update command user interface). Для обработки этих команд предназначена макрокоманда ON_UPDATE_COMMAND_UI , размещаемая в таблице сообщений класса.Для каждой строки меню, для каждой кнопки панели управления и для каждого индикатора панели состояния передается отдельное сообщение.
Время поступления команд пользовательского интерфейса зависит от самих обновляемых объектов.Меню
В случае меню команды обновления передаются в момент, когда пользователь открывает меню . Для каждой строки меню посылается отдельное сообщение. В результате для всех строк меню, для которых в таблице сообщений приложения присутствуют макрокоманды
ON_UPDATE_COMMAND_UI, вызываются соответствующие обработчики. Они могут изменить состояние меню - заблокировать отдельные строки меню, выделить их специальными символами Ö и · .Панели управления и состояния
Для кнопок панели управления и индикаторов панели состояния команды обновления передаются в период “бездействия” приложения, когда очередь сообщений приложения пуста.
Если очередь сообщений приложения пуста, вызывается метод OnIdle главного класса приложения. В приложении можно переопределить этот метод и выполнять какую-либо фоновую работу.
Метод OnIdle определен в классе CWinApp и по умолчанию выполняет обновление пользовательского интерфейса - передает команды обновления для тех кнопок панели управления и индикаторов панелей состояния, которые имеют в таблице сообщений приложения макрокоманду ON_UPDATE_COMMAND_UI. Эта макрокоманда вызывает методы-обработчики, которые могут изментть состояние кнопок и индикаторов панелей управления и панелей состояния.
Как правило, ряд строк меню и кнопок панелей управления имеют одинаковые идентификаторы. В этом случае для обработки команд обновления строк меню и кнопок панели управления вызываются одни и те же методы.
Органы диалоговых панелей управления
Не только меню и панели управления обновляются с использованием механизма обновления. Точно также можно обновить и состояние кнопок и других органов управления диалоговых панелей.
Макро команда ON_UPDATE_COMMAND_UI
Макрокоманда
ON_UPDATE_COMMAND_UI для использования в таблицах сообщений приложения и имеет следующий формат :ON_UPDATE_COMMAND_UI(id, Имя_метода )
Параметр
id определяет идентификатор строки меню, кнопки панели управления или индикатора панели состояния, для которых надо обработать команду обновления. Параметр Имя_метода задает метод, выполняющий обновление.Если один и тот же метод вызывается для обработки различных макрокоманд обновления, можно использовать другую макрокоманду -
ON_UPDATE_COMMAND_UI_RANGE. Она вызывает метод Имя_метода для обработки всех команд обновления, идентификаторы которых находятся в промежутке значений от id1 до id2:ON_UPDATE_COMMAND_UI_RANGE(id1, id2, MethodName )
Наилучшим способом создания обработчиков команд обновления и включения соответствующих макрокоманд в таблицу сообщений приложения является использование средства
ClassWizard.Однако назначить один обработчик команд обновления нескольким объектам пользовательского интерфейса
ClassWizard не позволяет. При необходимости можно самостоятельно включить в таблицу сообщений макрокоманду ON_UPDATE_COMMAND_UI_RANGE.Еще одно ограничение
ClassWizard заключается в том, что он не дает возможности создать обработчики для команд обновления от индикаторов панели состояния. Такие обработчики придется добавлять к класса приложения вручную.Рассмотрим описание метода-обработчика команд обновления. Вызывающийся макрокомандами
ON_UPDATE_COMMAND_UI_RANGE и ON_UPDATE_COMMAND_UI метод-обработчик команд обновления имеет следующий формат :afx_msg void Имя_метода (CCmdUI *pCmdUI);
Имя метода-обработчика обычно формируется из префикса
OnUpdate и названия соответствующего объекта интерфейса пользователя - строки меню, кнопки панели управления или индикатора панели состояния.В качестве параметра этому методу передается указатель на объект класса
CCmdUI . Этот объект представляет элемент пользовательского интерфейса (строку меню, кнопку панели управления, индикатор панели состояния), для которого надо обработать команду обновления. Вызывая методы класса CCmdUI , можно легко изменять состояние соответствующего объекта интерфейса пользователя.Методы класса
C CmdUIКласс
CCmdUI играет важную роль в работе таких объектов пользовательского интерфейса как меню, панели управления и панели состояния. Методы этого класса позволяют заблокировать отдельные элементы меню, панелей управления и состояния, отметить их и т.д.Также этими методами можно пользоваться для блокирования элементов диалоговых панелей управления, для выбора положения переключателей в этих панелях.
Рассмотрим немногочисленные методы этого класса.
Метод
Enable Этот виртуальный метод позволяет установить или снять блокировку с объекта пользовательского интерфейса, представленного объектом класса CСmdUI .Заблокированные элементы не могут быть использованы до момента снятия блокировки. В случае блокировки индикатора панели состояния его текст не будет отображаться.
Метод
SetCheck. Виртуальный метод SetCheck можно применять для изменения состояния строки меню и кнопок панели управления .При использовании этого метода для строки меню нулевое значение параметра приводит к выделению строки меню символом Ö , а единичное значение - к снятию выделения.
В случае применения метода
SetCheck для кнопки панели управления параметр метода задает новое состояние кнопки : нулевое значение - кнопка переходит в нажатое состояние, единичное значение - кнопка переходит в отжатое состояние, если параметр равен двум - кнопка переходит в промежуточное состояние.Этот же метод используется и для управления внешним видом индикаторов панелей состояния . Если параметр метода равен нулю, то рамка индикатора изменяется таким образом, что он будет располагаться выше общего уровня панели состояния. Если параметр равен единице, то индикатор переходит в нормальное состояние.
Метод
SetRadioВиртуальный метод
SetRadio можно применять для изменения состояния строки меню и кнопок панели управления .Если метод используется для управления меню, то значение
TRUE параметра приводит к выделению строки меню символом · . Если параметр равен FALSE, то выделение снимается.В случае использования метода
SetRadio для кнопкой панели управления параметр метода задает новое состояние кнопки. Значение FALSE переводит кнопку в нажатое состояние, значение TRUE - в отжатое состояние.Этот же метод используется и для управления внешним видом индикаторов панелей состояния. Если параметр метода равен
FALSE, то рамка индикатора изменяется таким образом, что он будет располагаться выше общего уровня панели состояния. Если параметр равен TRUE, то индикатор переходит в нормальное состояние.Метод
SetTextВиртуальный метод
SetText может быть вызван для изменения текста, отображаемого в панелях состояния, в строке меню, в названиях кнопок и некоторых элементах диалоговых панелей управления. В качестве параметра следует указать строку, которую нужно вывести .Следует отметить, что при использовании метода
SetText для изменения текста в панелях состояния необходимо отдельно позаботиться об изменение размера индикатора. Метод SetText не меняет размера индикатора, потому следует рассчитать ширину текста и изменить размер индикатора с помощью соответствующего метода.Элементы данных класса
CcmdUIВ состав класса
CCmdUI входит и несколько элементов данных. Они позволяют определить идентификатор строки меню, кнопки панели управления или индикатора панели состояния, для которого вызван метод-обработчик :- m_nID - идентификатор объекта, для которого вызван метод-обработчик.
- m_nIndex - индекс объекта, для которого вызван метод-обработчик.
- m_pMenu - указатель на меню. Если команда обновления передана не от меню, элемент m_pMenu содержит значение NULL.
- m_pOther - указатель на панель состояния или панель управления. Если команда обновления передана от меню, элемент m_pOther содержит значение NULL.