![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Часто требуется после выполнения фрагмента программы дать возможность пользователю выбрать один из нескольких вариантов продолжения.
Обычно это реализуется с помощью ввода с клавиатуры без отображения на экране каких-либо символов. Более того, чаще всего используют клавиши, не имеющие графического изображения соответствующего символа. Такие символы часто называют управляющими.
Клавиши, не имеющие графического изображения:
ß à 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 (in t 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 ();
}
Вопросы для самопроверки и контроля
Вопросы для самопроверки
1. Каков состав расширенного кода клавиатуры?
2. Как выделить из прочитанного расширенного кода содержимое младшего байта(ASCII -символ)?
Контрольные вопросы
1. В чем отличие процесса чтения расширенного кода функциями bioskey и getch?
2. Какую инструкцию удобно использовать для управления программой с помощью клавиатуры?
ЗАДАЧИ
Дата публикования: 2014-11-02; Прочитано: 416 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!