Описание пользователя
Глава 3. Использование стандартных модулей автокомпиляции
§3.7. Краткий перечень вводимых в модель описаний и реакций на события
§3.7.4. Реакции блока на мышь и клавиатуру
Рассматриваются реакции на события, связанные с действиями пользователя в режимах моделирования и расчета: движение курсора мыши, нажатие кнопок и т.п. Такие реакции позволяют создавать интерактивные блоки.
§3.7.4.1. Нажатие кнопки мыши
Это событие возникает в режимах моделирования и расчета при нажатии пользователем любой кнопки мыши в момент нахождения курсора в пределах изображения блока, если этот блок находится на видимом слое, редактирование которого разрешено, и в параметрах этого блока разрешена реакция на мышь (см. рис. 452). Реакция на нажатие кнопки мыши вводится на вкладке «» левой панели редактора модели: раздел «», подраздел «» (см. рис. 451). Эта реакция часто используется в моделях блоков пользовательского интерфейса: кнопок, рукояток и т.п.
В классе блока для этого события создается функция с именем rdsbcppMouseDown следующего вида:
// Mouse button down void rdsbcppBlockClass::rdsbcppMouseDown( RDS_PMOUSEDATA MouseData,int &Result) { … пользовательский текст реакции … }
У этой функции два параметра. Параметр MouseData – это указатель на структуру описания события RDS_MOUSEDATA:
typedef struct {
int x,y; // Координаты курсора мыши
int BlockX,BlockY; // Координаты точки привязки блока
int Left,Top; // Верхний левый угол изображения блока
int Width,Height; // Размеры изображения блока
int IntZoom; // Масштаб окна подсистемы в %
DWORD Button; // Кнопка мыши (RDS_M*)
DWORD Shift; // Флаги мыши и клавиатуры (RDS_M*, RDS_K*)
double DoubleZoom; // Масштабный к-т окна (в долях единицы)
int MouseEvent; // Событие
int Viewport; // Устаревшее, больше не используется
} RDS_MOUSEDATA;
typedef RDS_MOUSEDATA *RDS_PMOUSEDATA;
Поля структуры имеют следующий смысл:
- x, y (int)
- Координаты курсора мыши на рабочем поле окна подсистемы на момент возникновения события (уже с учетом масштаба подсистемы).
- BlockX, BlockY (int)
- Координаты точки привязки блока на рабочем поле с учетом масштаба и возможной связи положения этого блока с переменными. Для блоков с векторной картинкой точка привязки – это положение начала координат этой картинки, для всех остальных – левый верхний угол прямоугольной области.
- Left, Top, Width, Height (int)
- Координаты левого верхнего угла (Left, Top) прямоугольной области, занимаемой блоком, ее ширина (Width) и высота (Height) в текущем масштабе с учетом возможной связи положения и размеров блока с его переменными.
- IntZoom (int)
- Текущий масштаб окна подсистемы в процентах (используется крайне редко).
- Button (DWORD)
- Кнопка мыши, нажатие которой вызвало событие: RDS_MLEFTBUTTON – левая кнопка, RDS_MRIGHTBUTTON – правая кнопка, RDS_MMIDDLEBUTTON – средняя кнопка.
- Shift (DWORD)
- Набор битовых флагов, описывающих клавиши и кнопки, которые были нажатыми в момент возникновения события: RDS_MLEFTBUTTON, RDS_MRIGHTBUTTON, RDS_MMIDDLEBUTTON – нажатые кнопки мыши (см. выше), RDS_KSHIFT – нажата клавиша Shift, RDS_KALT – нажата клавиша Alt, RDS_KCTRL – нажата клавиша Ctrl.
- DoubleZoom (double)
- Nекущий масштаб окна родительской подсистемы блока в долях единицы: 1 – 100%, 0.5 – 50%, 2 – 200% и т.п.
- Константа, указывающая на произошедшее событие (нажатие, отпускание, перемещение курсора и т.п.) Поскольку в автокомпилируемых моделях для каждого события создается независимая функция, в них это поле структуры используется крайне редко. Подробнее о его возможных значениях можно прочесть в А.2.6.10 приложений.
Из этой структуры можно узнать, какая именно кнопка мыши нажата, где в пределах изображения блока находился курсор в момент нажатия, и т.п.
Второй параметр функции реакции – это ссылка на целую переменную Result. Через этот параметр модель может сообщить RDS, обработала ли она нажатие кнопки. Для этого параметру Result нужно присвоить одну из трех стандартных констант:
- RDS_BFR_DONE – блок среагировал на мышь, никаких дальнейших действий не требуется;
- RDS_BFR_NOTPROCESSED – блок отказался реагировать на мышь, необходимо вызвать реакцию блока, находящегося под ним, если такой есть, или реакцию всей подсистемы;
- RDS_BFR_SHOWMENU – модель успешно обработала нажатие кнопки мыши, но, несмотря на это, если нажатая кнопка была правой, необходимо показать стандартное контекстное меню RDS.
Манипулируя значением Result, можно, например, сделать блок в некоторых его состояниях «прозрачным» для щелчков мыши, возвращая RDS_BFR_NOTPROCESSED (реагировать на нажатие будет блок под данным). Если блок реагирует только на щелчки левой кнопки, при щелчках правой желательно присваивать Result значение RDS_BFR_SHOWMENU, иначе контекстное меню блока в режимах моделирования и расчета не будет выведено. По умолчанию в Result записано значение RDS_BFR_DONE, поэтому, если в реакции на событие этому параметру ничего не будет присвоено, блок будет считаться успешно обработавшим нажатие.
Пример реакции на это событие приведен в §3.6.11. При написании моделей блоков без использования модуля автокомпиляции нажатию кнопки мыши соответствует константа RDS RDS_BFM_MOUSEDOWN.