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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 нужно присвоить одну из двух стандартных констант:

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

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


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