Руководство программиста
Глава 1. Устройство RDS
§1.7. Реакция на действия пользователя
Описываются способы реакции модели блока на действия пользователя: нажатие кнопок и перемещение курсора мыши, нажатие и отпускание клавиш клавиатуры. Также описывается создание собственных пунктов меню блока и функции настройки параметров.
Самый простой способ заставить блок реагировать на действия пользователя – это разрешить данному блоку реакцию на мышь и клавиатуру (установив флаги в окне параметров блока, см. рис. 7) и добавить в модель обработку соответствующих событий. Следует, однако, помнить, что информация об этих событиях будет передаваться блоку только в режимах моделирования и расчета, в режиме редактирования часть реакций блока отключается. Кроме того, на мышь и клавиатуру не реагируют блоки, расположенные на неактивных и невидимых слоях.
Для того, чтобы блок мог реагировать на манипуляции мышью (например, если блоки должны изображать какие-либо кнопки и переключатели, они должны реагировать на щелчки мыши), необходимо включить в окне параметров блока флаг «». При этом, если курсор мыши будет находиться в пределах описывающего прямоугольника блока (минимального прямоугольника, полностью покрывающего изображение блока в окне подсистемы), модель будет вызываться каждый раз при нажатии кнопки мыши, при ее отпускании, а также при перемещении курсора, когда хотя бы одна кнопка нажата. Чтобы модель блока вызывалась при перемещении курсора даже тогда, когда ни одна кнопка не нажата, необходимо включить в окне параметров блока флаг «». Это может потребоваться при создании блоков, изображающих диаграммы и графики – при перемещении курсора мыши над полем диаграммы можно выводить координаты точки под курсором.
Все описанные выше события передаются в модель блока только тогда, когда курсор мыши находится в пределах описывающего прямоугольника блока. При необходимости, модель блока может захватить мышь, после чего вся информация о перемещениях курсора и нажатии кнопок будет поступать только в эту модель, даже если курсор выйдет за пределы блока, до тех пор пока модель не освободит мышь. Этот механизм может быть полезен, например, при создании модели блока, имитирующего рукоятку для задания какого-либо значения. При нажатии левой кнопки такая модель может захватить мышь и использовать информацию о перемещении курсора для изменения положения нарисованной рукоятки, а при отпускании кнопки – освобождать мышь и фиксировать получившееся значение. Таким образом, рукоятка, рисуемая блоком, будет перемещаться, даже если пользователь выведет курсор за пределы изображения блока, до тех пор, пока он не отпустит кнопку.
Если внешний вид блока определяется векторной картинкой и ее элементам присвоены целые идентификаторы, модель при обработке событий может определить, какой элемент картинки находится под курсором мыши. Для этого используется сервисная функция rdsGetPictureObjectId, возвращающая идентификатор элемента картинки, на который приходится точка с заданными координатами. Можно, например, создать в картинке блока специальные активные зоны и присвоить им разные идентификаторы, а затем, обрабатывая событие нажатия кнопки мыши, увеличивать или уменьшать значение какой-либо переменной блока в зависимости от зоны, в которой находится курсор.
Для того, чтобы блок мог реагировать на клавиатуру, необходимо включить в окне параметров блока флаг «» и добавить в модель обработку соответствующих событий (нажатия и отпускания клавиш). Модель блока будет вызываться только в том случае, если RDS находится в режиме моделирования или расчета и окно подсистемы, в которую входит блок, открыто и активно (имеет фокус). При нажатии и отпускании клавиш по очереди вызываются модели всех блоков активного окна подсистемы, для которых разрешена реакция на клавиатуру. Вызванная модель может прекратить перебор блоков, проинформировав RDS о том, что дальнейшая обработка не требуется.
Если ни один из блоков в окне не среагировал на действия пользователя, может быть вызвана модель подсистемы, которой принадлежит это окно (для этого необходимо разрешить обработку соответствующих событий в окне параметров подсистемы). Для каждого события, связанного с мышью и клавиатурой, на которое реагируют блоки, существует похожее событие для подсистемы. Например, при нажатии кнопки мыши модели блоков вызываются с параметром RDS_BFM_MOUSEDOWN, а модель подсистемы, которой принадлежит окно, – с параметром RDS_BFM_WINDOWMOUSEDOWN. Подсистема может реагировать на оба этих события: если пользователь нажмет кнопку мыши на изображении подсистемы в окне ее родителя (где она выглядит как обычный блок, рис. 12а), ее модели будет передано событие RDS_BFM_MOUSEDOWN, а при нажатии кнопки на свободном месте ее собственного окна (рис. 12б) – событие RDS_BFM_WINDOWMOUSEDOWN.
Рис. 12. Реакция подсистемы на кнопку мыши на ее изображении (а) и внутри ее окна (б)
Рис. 13. Расширения системного меню
Все описанные выше реакции работают только в режимах моделирования и расчета. Для взаимодействия с пользователем в режиме редактирования модель блока может добавить свои пункты в главное (сервисной функцией rdsRegisterMenuItem, см. §2.12.7) или контекстное (сервисными функциями rdsRegisterContextMenuItem и rdsAdditionalContextMenuItem, см. §2.12.6) меню RDS. При добавлении пункта меню модель указывает целый идентификатор, который будет передаваться ей при выборе пользователем этого пункта. Расширения контекстного меню блока, добавленные моделью, отображаются во всех режимах при щелчке правой кнопкой мыши на изображении блока. В режиме редактирования они дублируются в подменю «» главного меню, если добавивший их блок выделен. Пункты, добавленные моделями блоков в главное меню, отображаются в подменю «» и активны независимо от режима или выделенности какого-либо блока (рис. 13). Кроме того, с пунктами главного меню могут быть связаны «горячие клавиши», нажатие которых вызывает данный пункт меню независимо от того, какое окно в данный момент активно. Таким образом, добавив в главное меню RDS собственный пункт и задав для него сочетание клавиш, модель блока сможет реагировать на нажатие этих клавиш в любом режиме, даже если окно с данным блоком не открыто. Обычно в главное меню добавляют свои пункты уникальные, то есть присутствующие в схеме в единственном экземпляре, блоки.
В режиме редактирования модель блока может также реагировать на вызов пользователем функции настройки, если он разрешен в окне параметров блока (см. рис. 7). Функции настройки соответствует пункт контекстного меню или подменю «» (название пункта можно изменять), при выборе которого модель вызывается с параметром RDS_BFM_SETUP. В ответ на этот вызов модель должна самостоятельно организовать диалог с пользователем средствами Windows или при помощи сервисных функций, описанных в §2.7.2.