УПРАВЛЕНИЕ ПРОГРАММОЙ С ПОМОЩЬЮ КЛАВИАТУРЫ

Часто требуется после выполнения фрагмента программы дать возможность пользователю выбрать один из нескольких вариантов продолжения.

Обычно это реализуется с помощью ввода с клавиатуры без отображения на экране каких-либо символов. Более того, чаще всего используют клавиши, не имеющие графического изображения соответствующего символа. Такие символы часто называют управляющими.

Клавиши, не имеющие графического изображения:

ß à 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( );

}