ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Функция ожидания выбора пользователя и интерфейс с клавиатуройФункции 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; } Вопросы для самоконтроля
Вопросы для самостоятельного изучения
Лекция 19. Объектное программирование в С++: базовые элементы Не нашли, что искали? Воспользуйтесь поиском:
|