Часто требуется после выполнения фрагмента программы дать возможность пользователю выбрать один из нескольких вариантов продолжения.
Обычно это реализуется с помощью ввода с клавиатуры без отображения на экране каких-либо символов. Более того, чаще всего используют клавиши, не имеющие графического изображения соответствующего символа. Такие символы часто называют управляющими.
Клавиши, не имеющие графического изображения:
ß à PgUp PgDn Del End Home и т.п.
Каждая клавиша имеет расширенный код символа, занимающий 2 байта. Если в нем младший байт не равен 0, то в нем хранится ASCII-код символа, если он равен 0, то в старшем байте находится сканкод клавиши, характерный только для IBM PC. Все управляющие клавиши, кроме клавиш Esc, Tab, Enter имеют нулевой младший байт, поэтому приходится по-разному обрабатывать управляющие и обычные символы. Более того, для управления программой можно использовать сочетания клавиш типа: Shift+Tab, Alt+F1, Ctrl+F10 и т.п., которые имеют свои расширенные коды.
Байт 2 Байт 1
Расширенный код клавиатуры: Сканкод ASCII-код
Для чтения символов с клавиатуры без отображения на экран используются функции:
- getch( ),
- int bioskey(int cmd); à Прототип в файле bios.h.
Возможные значения параметра cmd={0|1|2}. Если значение cmd равно 0, то функция возвращает расширенный код клавиатуры и удаляет его из буфера клавиатуры, если буфер пуст, то ожидает нажатие клавиши. Как работает функция bioskey с параметрами {1|2}, можно посмотрить в подсказке(help) среды Borland C++ 3.1.
Пример. Фрагмент реализации простейшего текстового редактора.
#include <bios.h>
#define LEFT 19200
#define RIGHT 19712
#define HOME 18176
#define END 20224
#define DEL 21248
#define ENTER 7181
...................
flin=1;
while(flin){
cod = bioskey(0);
switch(cod){
case ENTER: /* Конец ввода */
flin = 0; break;
case LEFT : /* Влево на 1 символ */
.......
break;
case RIGHT: /* Вправо на 1 символ */
.......
break;
case HOME : /* В начало строки */
.......
break;
case END : /* В конец строки */
.......
break;
case DEL : /* Удалить символ над курсором */
.......
break;
default : /* Ввод символа */
cod &= 0x00ff;
if(cod >= 040){ /* Нормальный символ */
.........
}
} /* End switch */
..........
} /* End while */
Расширенные коды клавиш можно взять из системы help, либо написать программу с использованием функции bioskey(0), печатающую их в нужной системе счисления при нажатии соответствующей клавиши.
Те же манипуляции можно выполнить и с функцией getch( ), только нужно дважды читать один и тот же расширенный код. Первое обращение к функции getch( ) читает младший байт буфера клавиатуры. Если он не равен 0, то следующее обращение к getch( ) будет вновь читать младший байт следующего символа, если же он равен 0, то следующее обращение прочтет старший байт буфера клавиатуры.
Пример.
cod1 = getch( ); // Читаем младший байт
if(cod1 == 0){ // Читаем старший байт
cod2 =getch( );
}