Функция ожидания выбора пользователя и интерфейс с клавиатурой
Функции display_menu() и get_resp() выполняют вывод на экран пунктов меню и сканирование клавиатуры с целью анализа команд пользователя, соответственно.
void display_menu(char * menu[], int x, int y, count)
{
// menu – массив ссылок на строки меню
// x, y – координата левого верхнего угла для вывода меню
// count – количество строк меню
register int i;
for(i = 0; i , count; i++)
{
write _string(x, y, menu[i], NORM_VID);
x++;
}
}
В программе используется константа NORM_VID, определяемая пользователем и соответствующая атрибуту для высвечивания пунктов меню в нормальном виде (без выделения яркостью и мигания). Функция write_string() была рассмотрена ранее.
int get_resp(int x, int y, int count, char *menu[], char *keys) // ввод выбора пользователя
// x, y, count – координаты и число строк меню
// строки текста меню
// строка горячих клавиш
{
union inkey{
char ch[2]; // комбинация ASCIIZ-кода и скэн-кода клавиатуры
int i;
}c;
int arrow_choice = 0; // выбор стрелками
int key_choice; // выбор горячим ключом
y++;
// подсветка выбора по умолчанию
goto_xy(x, y);
write_string(x, y, menu[0], REV_VID); // REV_VID – атрибут подсветки
for(;;)
{
while(!bioskey(1)); // цикл сканирования клавиатуры
c.i = bioskey(0);
// восстановление выбора нормальным цветом
goto_xy(arrow_Choice, y);
write_string(x+arrow_choice, y, menu[arrow_choice], NORM_VID);
if(c.ch[0])
{ // ASCIIZ - код
key_choice = is_in(keys, tolower(c.ch[0]));
if(key_choice) return key_choice-1;
switc(c.ch[0]) // не горячая клавиша
{
case ‘r’: return arrow_choice; // клавиша Enter
case ‘ ‘:arrow_choice++; // пробел как стрелка вниз
break;
case ESC: return -1; // выход без выбора
}
}
else
{ // не отображаемая спец-клавиша
switch(c.ch[1]) // стрелки вверх и вниз
{
case 72: arrow_choice--; // стрелка вверх
break;
case 80: arrow_choice++; // стрелка вниз
break;
}
}
// ограничение продвижения по пунктам меню
arrow_choice = (arrow_choice == count) ? 0 : arrow_choice;
arrow_choice = arrow_choice < 0 ? count -1 : arrow_choice;
// подсветка новой позиции возможного выбора
goto_xy(x+ arrow_choice, y);
write_string(x+ arrow_choice, y, menu[arrow_choice], REV_VID);
}
}
Интерфейс с клавиатурой реализуется функцией bioskey() (см. Приложение).
Функция is_in() возвращает позицию «горячей клавиши» в строке, содержащей символы «горячих клавиш», увеличенную на 1. Если была нажата не та клавиша, то возвращается значение 0.
int is_in(char *s, char c)
{
register int i;
for(i=0; *s; i++)
if(*s++ ==c) return i+1;
return 0;
}
Вопросы для самоконтроля
- Назначение макрокоманд FP_SEG() и FP_OFF() и файл прототипов?
- Каким образом в программах вычисляется начальный адрес видеопамяти?
- Для чего используются в программе константы NORM_VID и REV_VID?
- Как выполняется bioskey(0)?
- Как выполняется bioskey(1)?
Вопросы для самостоятельного изучения
- Уметь объяснить все детали организации и работы программы!
Лекция 19. Объектное программирование в С++: базовые элементы
Дата добавления: 2016-05-26; просмотров: 2325;