Описание пользователя
Глава 3. Использование стандартных модулей автокомпиляции
§3.7. Краткий перечень вводимых в модель описаний и реакций на события
§3.7.4. Реакции блока на мышь и клавиатуру
§3.7.4.5. Нажатие клавиши
Это событие возникает в режимах моделирования и расчета при нажатии пользователем какой-либо клавиши на клавиатуре, если окно подсистемы с данным блоком имеет фокус (то есть, это самое верхнее окно, и RDS при этом – активное приложение) и на вкладке «» окна параметров блока включен флажок «» (рис. 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.