Раздел
Клавиатура, мышь и события
Ввод в Axiom устроен двояко: программе доступно текущее состояние устройств и очередь уже случившихся событий. Состояние читают функции INKEY, KEYDOWN, KEYPRESS и функции мыши, а события передаются процедурам, назначенным операторами ON KEY и ON MOUSE. Канонические имена клавиш и их алиасы собраны в таблице имён клавиш.
Опрос или обработчик
Сначала выбирают способ реакции: проверять ввод в собственном цикле или назначить отдельную процедуру для подходящего события. При опросе программа сама вызывает функцию и получает ответ в тот момент, который выбрала; при обработчике процедура вызывается средой, когда событие уже произошло.
- встроенная функция
INKEYчитает следующую клавишу как строку; - встроенная функция
KEYDOWNпроверяет текущее удержание клавиши или сочетания клавиш; - встроенная функция
KEYPRESSпроверяет одно событие нажатия клавиши; - оператор
ON KEYрегистрирует обработчик клавиатурного события; - встроенные функции
MOUSEX,MOUSEY,MOUSEBUTTONиMOUSEPRESSчитают состояние мыши; - оператор
ON MOUSEрегистрирует обработчик события мыши.
Клавиатура
При опросе программа сама вызывает функцию: KEYDOWN читает удержание, KEYPRESS извлекает заданное нажатие, а INKEY извлекает следующую клавишу строкой. Ввод доступен из текстовой области IDE, окна SCREEN 0 и графического окна SCREEN 1..10.
| Страница | Что описывает |
|---|---|
INKEY | Неблокирующее чтение одной клавиши из очереди. |
KEYDOWN | Проверка текущего удержания клавиши или строкового сочетания через +. |
KEYPRESS | Одноразовая проверка события нажатия клавиши. |
ON KEY | Регистрация, пауза, возобновление и отключение обработчика клавиатурного события. |
Имена клавиш
Функции KEYDOWN и KEYPRESS, а также оператор ON KEY принимают имена клавиш из этой таблицы. Функция INKEY не принимает имя: для именованной клавиши она возвращает каноническую запись, например "ESC" или "LEFT", а для печатного ввода — полученный символ.
| Клавиша | Каноническое имя Axiom | Допустимые алиасы |
|---|---|---|
| Стрелка влево | "LEFT" | "LEFTARROW", "ARROWLEFT" |
| Стрелка вправо | "RIGHT" | "RIGHTARROW", "ARROWRIGHT" |
| Стрелка вверх | "UP" | "UPARROW", "ARROWUP" |
| Стрелка вниз | "DOWN" | "DOWNARROW", "ARROWDOWN" |
| Escape | "ESC" | "ESCAPE" |
| Enter | "ENTER" | "RETURN" |
| Backspace | "BACKSPACE" | "BACK", "BKSP" |
| Tab | "TAB" | — |
| Delete | "DELETE" | "DEL" |
| Insert | "INSERT" | "INS" |
| Home | "HOME" | — |
| End | "END" | — |
| Page Up | "PAGEUP" | "PAGE UP", "PAGE-UP", "PGUP", "PRIOR" |
| Page Down | "PAGEDOWN" | "PAGE DOWN", "PAGE-DOWN", "PGDN", "PGDOWN", "NEXT" |
| Пробел | "SPACE" | "SPACEBAR", "SPACE BAR", "SPACE-BAR" |
| Shift | "SHIFT" | "SHIFTKEY", "SHIFT KEY", "SHIFT-KEY" |
| Control | "CTRL" | "CONTROL", "CONTROLKEY", "CONTROL KEY", "CONTROL-KEY", "CTL" |
| Alt | "ALT" | "ALTKEY", "ALT KEY", "ALT-KEY", "MENU" |
| Функциональные клавиши | "F1"–"F12" | — |
| Буквенные клавиши | "A"–"Z" | — |
| Цифровые клавиши | "0"–"9" | — |
Для именованных клавиш регистр не важен. Пробелы, дефисы и подчёркивания в имени игнорируются, поэтому "PAGEUP", "PAGE UP", "PAGE-UP" и "PAGE_UP" обозначают одну клавишу.
Буквы "A"–"Z" и цифры "0"–"9" в таблице обозначают имена, которые проверяет функция KEYDOWN; клавиша цифры основного ряда и соответствующая клавиша цифрового блока имеют одно имя. Функции KEYPRESS и INKEY, а также оператор ON KEY для обычного печатного ввода используют поступивший символ, в том числе знак пунктуации. Символ зависит от раскладки и клавиши SHIFT, поэтому он не является алиасом именованной клавиши. Функция KEYDOWN не проверяет произвольные знаки пунктуации как состояние клавиш.
Имена SHIFT, CTRL и ALT проверяют удержание в функции KEYDOWN. В сочетании клавиш они задают удерживаемый модификатор, например CTRL+LEFT; событием в таком сочетании остаётся последняя клавиша. Модификаторы не передаются как отдельные события в INKEY, KEYPRESS или ON KEY.
Имя ANY и алиасы ANYKEY, ANY KEY и ANY-KEY задают цель обработчика ON KEY для любой клавиши. Эта цель не обозначает отдельную физическую клавишу.
Запускаемый пример с алиасами: KEYDOWN: CONTROL и PAGE UP.
Мышь
Мышь требует графического SCREEN 1..10 или CANVAS. На экране координаты измеряются в пикселях клиентской области, без преобразования VIEW/WINDOW. На холсте функции MOUSEX, MOUSEY и параметры обработчика уже содержат мировые координаты, рассчитанные через VIEWPORT и CAMERA.
| Страница | Что описывает |
|---|---|
MOUSEX | Текущая горизонтальная координата указателя. |
MOUSEY | Текущая вертикальная координата указателя. |
MOUSEBUTTON | Текущее удержание левой, правой или средней кнопки. |
MOUSEPRESS | Одноразовое чтение события нажатия кнопки. |
ON MOUSE | Обработчики нажатия, отпускания, перемещения и колеса мыши. |
Куда поступает ввод
Для текстовой программы ввод принимает область вкладки «Консоль». Там работают INPUT, клавиатурный опрос, события ON KEY и ожидание SLEEP; при фокусе редактора клавиши изменяют исходник.
После открытия SCREEN или CANVAS ввод направляется в окно программы. Для холста положение мыши сначала масштабируется из размера отображаемого изображения в физические пиксели, затем переводится областью и камерой в мировую точку.
Удержание прекращается при отпускании клавиши. Потеря фокуса очищает сохранённые состояния клавиш и кнопок, чтобы программа не продолжала движение после переключения окна.
Очередь и обработчики
В цикле опроса действия выполняются в выбранном программой порядке. Операторы ON KEY и ON MOUSE назначают процедуры, которые вызываются при появлении подходящего события между инструкциями.
Соседние перемещения мыши объединяются до одного события, а соседние ступени колеса складываются; нажатия и отпускания сохраняют порядок. Значение колеса измеряется в единицах Windows: обычная ступень равна 120. Точка вне видимого изображения CANVAS или вне активной области VIEWPORT не образует мировую координату.
События проверяются на границах инструкций и итераций циклов. Обработчик не прерывает вычисление выражения. Если обработчик забрал событие, последующий опрос этой же очереди его не получает.
INKEY извлекает очередное клавиатурное событие, KEYPRESS извлекает одно подходящее событие, а KEYDOWN проверяет удержание и не меняет очередь. MOUSEPRESS извлекает одно событие нажатия кнопки, MOUSEBUTTON проверяет удержание. Подходящие события, уже полученные обработчиками ON KEY или ON MOUSE, последующему опросу не возвращаются.
Клавиатурный опрос не требует SCREEN. Чтение мыши требует графического SCREEN или CANVAS; текстовый SCREEN 0 не подходит. Регистрация ON MOUSE допустима до открытия поверхности: вызовы мышиных обработчиков начинаются при активной графической поверхности.
Цикл опроса и пауза SLEEP
В цикле регулярно читайте ввод, выполняйте действие и задавайте короткую паузу оператором SLEEP. Число после него измеряется в миллисекундах. Форма без числа ждёт любую клавишу и забирает её из очереди; для периодического опроса нужна форма с длительностью.
DIM pressedKey AS STRING = ""
DO WHILE pressedKey <> "ESC"
pressedKey = INKEY()
IF pressedKey <> "" THEN PRINT pressedKey
SLEEP 10
LOOPФункция не блокирует цикл, пока очередь пуста. Нажатие ESC завершает цикл после текущей итерации.
Запускаемые примеры
Запускаемые проверки клавиатуры и мыши находятся в тематических папках samples/functions/ и samples/operators/.