Функция ожидания выбора пользователя и интерфейс с клавиатурой


Функции 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.