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

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.2. События блока и связанные с ними описания

А.2.6. События пользовательского интерфейса и рисования внешнего вида блоков

А.2.6.7. RDS_BFM_KEYDOWN – нажатие клавиши

# Приложения

## Приложение А. Функции, константы и структуры 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.

См. также

RDS_BFM_KEYUP, RDS_BFM_WINDOWKEYDOWN, RDS_BFM_WINDOWKEYUP.