Приложения
Приложение А. Функции, константы и структуры RDS
А.2. События блока и связанные с ними описания
А.2.6. События пользовательского интерфейса и рисования внешнего вида блоков
А.2.6.7. RDS_BFM_KEYDOWN – нажатие клавиши
Поток, в котором вызывается функция модели
Главный поток RDS.
Первый параметр функции модели (int CallMode)
Константа RDS_BFM_KEYDOWN.
Третий параметр функции модели (void *ExtParam)
Указатель на структуру описания события RDS_KEYDATA.
Возвращаемое функцией модели значение
| RDS_BFR_DONE | Нажатие клавиши не обработано блоком. |
| RDS_BFR_STOP | Нажатие клавиши обработано, его не нужно передавать в остальные блоки подсистемы и вызывать соответствующий ей пункт главного меню RDS, если такой имеется. |
Примечания
Реакция на событие RDS_BFM_KEYDOWN вызывается при нажатии какой-либо клавиши клавиатуры в том случае, если одновременно выполняются следующие условия:
- RDS находится в режиме моделирования или расчета;
- окно подсистемы, в которой находится данный блок, имеет фокус ввода (то есть это самое верхнее окно и RDS – активное приложение);
- в параметрах блока разрешена реакция на клавиатуру.
В режимах моделирования и расчета при нажатии клавиши поочередно (в произвольном порядке) вызываются модели всех блоков активного окна подсистемы, для которых разрешена реакция на клавиатуру. В параметре ExtParam при этом передается указатель на структуру RDS_KEYDATA, в которой содержится описание нажатой клавиши. Если функция модели вернет константу RDS_BFR_DONE, нажатие клавиши будет считаться не обработанным, и вызовется модель следующего блока; если же она вернет RDS_BFR_STOP, перебор моделей блоков будет прекращен, кроме того, если нажатая клавиша соответствует какому-либо пункту меню RDS, этот пункт не будет вызван. Если ни одна из моделей блоков подсистемы не вернула RDS_BFR_STOP, будет вызвана модель самой подсистемы для реакции на событие RDS_BFM_WINDOWKEYDOWN. Если и модель подсистемы не сообщит об успешной обработке нажатия клавиши, нажатие будет обработано RDS (вызовется пункт главного меню, которому соответствует эта клавиша, если такой пункт есть). Реакция блоков на нажатие и отпускание клавиш подробно рассмотрена в §2.12.4 руководства программиста.
В режиме редактирования модели блоков не могут реагировать на нажатия клавиш. Единственный способ связать вызов модели блока с нажатием клавиши или сочетания клавиш в режиме редактирования – это зарегистрировать дополнительный пункт системного меню функцией rdsRegisterMenuItem и связать с ним «горячую клавишу».
Для описания нажатой клавиши служит структура RDS_KEYDATA (она используется и в других событиях реакции на клавиатуру):
typedef struct { RDSINT32 KeyCode; // Виртуальный код клавиши BOOL Repeat; // Признак автоповтора RDSINT32 RepeatCount; // Число повторений DWORD Shift; // Флаги клавиатуры (RDS_M*, RDS_K*) RDSINT32 KeyEvent; // Событие - RDS_BFM_KEYDOWN или // RDS_BFM_KEYUP BOOL Handled; // Событие обработано (возврат) RDSINT32 Viewport; // Устаревшее, больше не используется } RDS_KEYDATA; typedef RDS_KEYDATA *RDS_PKEYDATA;
Поля структуры
- KeyCode (RDSINT32)
- Виртуальный код клавиши (VK_*) согласно описаниям Windows API.
- Repeat (BOOL)
- Только для события нажатия клавиши: TRUE, если нажатие клавиши сгенерировано автоповтором клавиатуры, и FALSE в противном случае. Таким образом, при одиночных нажатиях клавиш в этом поле всегда находится FALSE.
- RepeatCount (RDSINT32)
- Только при автоповторе нажатия клавиши – число повторов с момента прошлого вызова реакции на событие.
- Shift (DWORD)
- Битовые флаги,
описывающие состояние специальных клавиш клавиатуры и кнопок мыши в момент нажатия
данной клавиши:
Для выделения флагов, относящихся только к кнопкам мыши или только к специальным клавишам, можно использовать специальные константы-маски:
RDS_MLEFTBUTTON Нажата левая кнопка мыши. RDS_MRIGHTBUTTON Нажата правая кнопка мыши. RDS_MMIDDLEBUTTON Нажата средняя кнопка мыши. RDS_KSHIFT Нажата клавиша Shift. RDS_KALT Нажата клавиша Alt. RDS_KCTRL Нажата клавиша Ctrl RDS_MOUSEFLAGS Все флаги кнопок мыши (RDS_MLEFTBUTTON | RDS_MRIGHTBUTTON | RDS_MMIDDLEBUTTON). RDS_KBDFLAGS Все флаги специальных клавиш (RDS_KSHIFT | RDS_KALT | RDS_KCTRL). - KeyEvent (RDSINT32)
- Произошедшее событие: RDS_BFM_KEYDOWN для нажатия клавиши и
RDS_BFM_KEYUP для отпускания. В реакциях на события RDS_BFM_KEY*
это поле дублирует параметр CallMode
функции модели. В реакциях подсистем на нажатия и отпускания клавиш
в окне RDS_BFM_WINDOWKEY* в это поле записывается идентификатор события, близкого по
смыслу к произошедшему событию: для RDS_BFM_WINDOWKEYDOWN в это поле записывается
RDS_BFM_KEYDOWN, для RDS_BFM_WINDOWKEYUP –
RDS_BFM_KEYUP:
Событие CallMode Поле KeyEvent Нажатие клавиши, обрабатывается блоком RDS_BFM_KEYDOWN RDS_BFM_KEYDOWN Отпускание клавиши, обрабатывается блоком RDS_BFM_KEYUP RDS_BFM_KEYUP Не обработанное блоками нажатие клавиши, обрабатывается подсистемой RDS_BFM_WINDOWKEYDOWN RDS_BFM_KEYDOWN Не обработанное блоками отпускание клавиши, обрабатывается подсистемой RDS_BFM_WINDOWKEYUP RDS_BFM_KEYUP - Handled (BOOL)
- Перед вызовом самого первого блока подсистемы это поле устанавливается в FALSE. Модель блока может присвоить ему TRUE для того, чтобы сообщить RDS об успешной обработке клавиши – это равносильно возврату RDS_BFR_STOP.
См. также