Навигация:
<< >> Оглавление Указатель

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.7. Краткий перечень вводимых в модель описаний и реакций на события

§3.7.4. Реакции блока на мышь и клавиатуру

Рассматриваются реакции на события, связанные с действиями пользователя в режимах моделирования и расчета: движение курсора мыши, нажатие кнопок и т.п. Такие реакции позволяют создавать интерактивные блоки.

§3.7.4.1. Нажатие кнопки мыши

Это событие возникает в режимах моделирования и расчета при нажатии пользователем любой кнопки мыши в момент нахождения курсора в пределах изображения блока, если этот блок находится на видимом слое, редактирование которого разрешено, и в параметрах этого блока разрешена реакция на мышь (см. рис. 452). Реакция на нажатие кнопки мыши вводится на вкладке «события» левой панели редактора модели: раздел «мышь и клавиатура», подраздел «нажатие кнопки мыши» (см. рис. 451). Эта реакция часто используется в моделях блоков пользовательского интерфейса: кнопок, рукояток и т.п.

В классе блока для этого события создается функция с именем rdsbcppMouseDown следующего вида:

  // Mouse button down
  void rdsbcppBlockClass::rdsbcppMouseDown(
                             MouseData,int &Result)
  {
     … пользовательский текст реакции … 
  }

У этой функции два параметра. Параметр MouseData – это указатель на структуру описания события RDS_MOUSEDATA:

  typedef struct {
    int x,y;           // Координаты курсора мыши
    int BlockX,BlockY; // Координаты точки привязки блока
    int Left,Top;      // Верхний левый угол изображения блока
    int Width,Height;  // Размеры изображения блока
    int IntZoom;       // Масштаб окна подсистемы в %
     Button;      // Кнопка мыши (RDS_M*)
     Shift;       // Флаги мыши и клавиатуры (RDS_M*, RDS_K*)
    double DoubleZoom; // Масштабный к-т окна (в долях единицы)
    int MouseEvent;    // Событие
    int Viewport;      // Устаревшее, больше не используется
  } ;
  typedef  *;

Поля структуры имеют следующий смысл:

xy (int)
Координаты курсора мыши на рабочем поле окна подсистемы на момент возникновения события (уже с учетом масштаба подсистемы).
BlockXBlockY (int)
Координаты точки привязки блока на рабочем поле с учетом масштаба и возможной связи положения этого блока с переменными. Для блоков с векторной картинкой точка привязки – это положение начала координат этой картинки, для всех остальных – левый верхний угол прямоугольной области.
LeftTopWidthHeight (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 нужно присвоить одну из трех стандартных констант:

Манипулируя значением Result, можно, например, сделать блок в некоторых его состояниях «прозрачным» для щелчков мыши, возвращая RDS_BFR_NOTPROCESSED (реагировать на нажатие будет блок под данным). Если блок реагирует только на щелчки левой кнопки, при щелчках правой желательно присваивать Result значение RDS_BFR_SHOWMENU, иначе контекстное меню блока в режимах моделирования и расчета не будет выведено. По умолчанию в Result записано значение RDS_BFR_DONE, поэтому, если в реакции на событие этому параметру ничего не будет присвоено, блок будет считаться успешно обработавшим нажатие.

Пример реакции на это событие приведен в §3.6.11. При написании моделей блоков без использования модуля автокомпиляции нажатию кнопки мыши соответствует константа RDS RDS_BFM_MOUSEDOWN.


<< >> Оглавление Указатель