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

Описания RDS

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

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

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

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

§3.7.4.5. Нажатие клавиши

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

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

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

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

##### §3.7.4.5. Нажатие клавиши

Это событие возникает в режимах моделирования и расчета при нажатии пользователем какой-либо клавиши на клавиатуре, если окно подсистемы с данным блоком имеет фокус (то есть, это самое верхнее окно, и RDS при этом – активное приложение) и на вкладке «DLL» окна параметров блока включен флажок «блок реагирует на клавиатуру» (рис. 487).

Рис. 487. Разрешение реакции на клавиатуру в окне параметров блока

Реакция на нажатие клавиши вводится на вкладке «события» левой панели редактора модели: раздел «мышь и клавиатура», подраздел «нажатие клавиши». В классе блока для нее создается функция с именем rdsbcppKeyDown следующего вида:

      // Key down
      void rdsbcppBlockClass::rdsbcppKeyDown(
                                RDS_PKEYDATA KeyData,int &Result)
      {
         … пользовательский текст реакции …
      }

В параметре KeyData в функцию передается указатель на структуру описания события RDS_KEYDATA:

      typedef struct {
        int KeyCode;     // Виртуальный код клавиши
        BOOL Repeat;     // Признак автоповтора
        int RepeatCount; // Число повторений
        DWORD Shift;     // Флаги клавиатуры (RDS_M*, RDS_K*)
        int KeyEvent     // Событие - RDS_BFM_KEYDOWN или RDS_BFM_KEYUP
        BOOL Handled;    // Событие обработано (возврат)
        int Viewport;    // Устаревшее, больше не используется
      } RDS_KEYDATA;
      typedef RDS_KEYDATA *RDS_PKEYDATA;

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

KeyCode(int)
  Виртуальный код нажатой клавиши (VK_*) согласно описаниям Windows API.
Repeat(BOOL)
  TRUE, если нажатие клавиши сгенерировано автоповтором клавиатуры, и FALSE в противном случае (при одиночных нажатиях клавиш в этом поле всегда находится FALSE).
RepeatCount(int)
  При автоповторе нажатия клавиши (Repeat==TRUE) – число повторов с момента прошлого вызова реакции на событие.
Shift(DWORD)
  Набор битовых флагов, описывающих клавиши и кнопки, которые были нажатыми в момент возникновения события: RDS_MLEFTBUTTON, RDS_MRIGHTBUTTON, RDS_MMIDDLEBUTTON – нажатые кнопки мыши (см. выше), RDS_KSHIFT – нажата клавиша Shift, RDS_KALT – нажата клавиша Alt, RDS_KCTRL – нажата клавиша Ctrl.
KeyEvent(int)
  Константа, указывающая на произошедшее событие (нажатие или отпускание клавиши). Поскольку в автокомпилируемых моделях для каждого из этих событий создается отдельная функция, это поле структуры используется крайне редко.
Handled(BOOL)
  Перед вызовом самого первого блока подсистемы (когда подсистема на переднем плане, о нажатии клавиш по очереди информируются все ее блоки) это поле устанавливается в FALSE. Модель блока может присвоит ему TRUE для того, чтобы сообщить RDS об успешной обработке нажатия клавиши и о том, что дальше перебирать блоки, информируя их о нажатии, не нужно.

Чаще всего в этой структуре используются поле KeyCode, содержащее код нажатой клавиши, и поле Shift, содержащее набор битовых флагов, соответствующих одновременно нажатым служебным клавишам Shift, Alt и Ctrl.

Второй параметр функции реакции – это ссылка на целую переменную Result. Через этот параметр модель может сообщить RDS, обработала ли она нажатие клавиши. Для этого параметру Result нужно присвоить одну из двух стандартных констант:

- RDS_BFR_DONE – нажатие клавиши не обработано блоком, RDS будет продолжать перебирать блоки подсистемы. пока один из них не обработает нажатие;
- RDS_BFR_STOP – нажатие клавиши обработано, его не нужно передавать в остальные блоки подсистемы и вызывать соответствующий ей пункт главного меню RDS, если такой имеется.

По умолчанию в Result записано значение RDS_BFR_DONE, поэтому, если в реакции на событие этому параметру ничего не будет присвоено, блок будет считаться успешно обработавшим нажатие.

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