Текущий раздел:

Описания RDS

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

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

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

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

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

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

## Глава 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.