Как запрограммировать распознавание нажатия клавиш PageUp и PageDown - C (СИ)
Формулировка задачи:
Доброго времени суток, уважаемые обыватели КиберФорума. Заканчивая работу над курсовым проектированием, приступил к отладке программы (задача программы - работа с информацией - добавление, удаление, редактирование, просмотр, сохранение в выходной форме) и решил, что листинг таблицы сотрудников, который сделал я (пример - ниже), не очень-то подойдёт для работы со списками в 500-1000 сотрудников (прокрутка осуществляется при помощи клавиш 'вверх' и 'вниз' - при этом справа от таблицы появляется курсор-бегунок, который указывает на конкретный элемент - и листать таблицу таким образом, чтобы дойти, допустим, до 755 сотрудника, будет не совсем удобно, да и времени займёт немало). Поэтому я решил добавить 2 дополнительных цикла 'case' с клавишами PageUp и PageDown (которые, соответственно, обеспечивали бы полистовую прокрутку - за одно нажатие таблица бы переходила к очередному набору сотрудников.
Поскольку пишу программу я на Си, а экран DOS ограничен по-вертикали, пришлось ограничить количество выводимых элементов (сотрудников) до 18 (остальное пространство - вывод 'шапки' и 'подвала' таблицы).
Суть моего вопроса: как запрограммировать распознавание нажатия клавиш PageUp и PageDown (в данный момент всё, что я знаю - это: клавиша 'вниз' - код '80', клавиша 'вверх' - '72', клавиша 'Escape' - '27')
Заранее всем заглянувшим и откликнувшимся большое спасибо. Жду ваших ответов...
P.S.: вот, собственно, исходник процедуры просмотра таблицы:
P.S.S.: 2 скрина - первый - просто таблица, второй - таблица с тем самым курсором-бегунком.
void view_table() /*процедура просмотра таблицы исходных данных*/ { if (count>0) { listptr temp; /*переменная типа 'указатель'*/ clrscr(); /*очистка экрана*/ char c; /*объявление перменной 'c' типа 'char'*/ int curpos = 0,ppos = 0; /*переменные для контроля поцизии курсора-бегунка*/ temp=top; /*в указатель temp передать начало списка*/ while(1) { clrscr(); /*очистка экрана*/ print_shapka(); /*вызов процедуры печати 'шапки' таблицы*/ for(int i=1;i<=18;i++) /*от 1 до 18 элементов*/ { if (temp!=NULL) /*если есть элемент*/ { if (temp->info.pol==1) c='М'; else c='Ж'; /*определение пола относительно поля 'info.pol'*/ printf("в•‘%2dв”‚ %-16s в”‚%4dв”‚%3cв”‚ %-13sв”‚%4dв”‚%4dв”‚%4dв”‚%4dв”‚%6dв•‘\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); /*вывести его на экран*/ temp=temp->next; /*перейти к слещующему элементу*/ } }; print_bottom(); /*вызов процедуры печати 'подвала' таблицы*/ char ch; /*объявление перменной 'ch' типа 'char'*/ while(1) { switch(ch = getch()) /*ожидание нажатия клавиши*/ { case 80: /*если нажата клавиша 'вниз'*/ { if(curpos < count) /*если позиция курсора-бегунка меньше количества элементов*/ { ppos = ++curpos; /*увеличить позицию будующего и текущего расположения курсора-бегунка*/ gotoxy(76,ppos+4-1); /*итти к позиции на экране, где размещался предыдущий курсор-бегунок*/ printf(" "); /*стереть предыдущее изображение куросра-бегунка*/ if(curpos > 18) /*если позиция курсора-бегунка больше 18*/ { ppos = 18; /*запомнить позицию будующего расположения куросора-бегунка в переменной 'ppos'*/ temp = top; /*в указатель temp передать начало списка*/ for(int i = 0;i < curpos-18;i++) /*сдвинуть первый выводимый на экран элемент на 1*/ temp = temp->next; /*сдвинуть первый выводимый на экран элемент на 1*/ clrscr(); /*очистка экрана*/ print_shapka(); /*вызов процедуры печати 'шапки' таблицы*/ for(int j = 0;j < 18;j++) /*от 1 до 18 элементов*/ { if(temp) /*если есть элемент*/ { if(temp->info.pol==1) c='М'; else c='Ж'; /*определение пола относительно поля 'info.pol'*/ printf("в•‘%2dв”‚ %-16s в”‚%4dв”‚%3cв”‚ %-13sв”‚%4dв”‚%4dв”‚%4dв”‚%4dв”‚%6dв•‘\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); /*вывести его на экран*/ temp = temp->next; /*перейти к слещующему элементу*/ } } print_bottom(); /*вызов процедуры печати 'подвала' таблицы*/ } } gotoxy(76,ppos+4); /*итти к позиции на экране, где нужно напечатать курсор-бегунок*/ printf("<<<"); /*напечатать курсор-бегунок*/ break; /*выход из цикла*/ } case 72: /*если нажата клавиша 'вверх'*/ { if(curpos > 0) { ppos--; /*уменьшить позицию будующего расположения курсора-бегунка*/ if(ppos < 0) ppos = 0; /*если позиция будующего расположения куросра-бегунка меньше 0*/ curpos--; /*уменшить текущую позицию курсора-бегунка*/ gotoxy(76,ppos+4+2); /*итти к позиции на экране, где размещался предыдущий курсор-бегунок*/ printf(" "); /*стереть предыдущее изображение куросра-бегунка*/ if(curpos >= 0) /*если текущая позиция курсора-бегунка больше либо равно 0*/ { if(ppos == 0) /*если позиция будующего расположения курсора-бегунка равна 0*/ { temp = top; /*в указатель temp передать начало списка*/ for(int i = 0;i < curpos;i++) /*сдвинуть первый выводимый на экран элемент на 1*/ temp = temp->next; /*сдвинуть первый выводимый на экран элемент на 1*/ clrscr(); /*очистка экрана*/ print_shapka(); /*вызов процедуры печати 'шапки' таблицы*/ for(int j = 0;j < 18;j++) /*от 1 до 18 элементов*/ { if(temp) /*если есть элемент*/ { if(temp->info.pol==1) c='М'; else c='Ж'; /*определение пола относительно поля 'info.pol'*/ printf("в•‘%2dв”‚ %-16s в”‚%4dв”‚%3cв”‚ %-13sв”‚%4dв”‚%4dв”‚%4dв”‚%4dв”‚%6dв•‘\n",temp->info.id,temp->info.fio,temp->info.godr,c,temp->info.prof,temp->info.staz,temp->info.razr,temp->info.nom_c,temp->info.nom_u,temp->info.summa); temp = temp->next; /*перейти к слещующему элементу*/ } } print_bottom(); /*вызов процедуры печати 'подвала' таблицы*/ }} } gotoxy(76,ppos+4+1); /*итти к позиции на экране, где нужно напечатать курсор-бегунок*/ printf("<<<"); /*напечатать курсор-бегунок*/ break; /*выход из цикла*/ } case 27 : return; /*если нажата клавиша 'Escape' - выйти из процедуры просмотра таблицы*/ } } } } };
Решение задачи: «Как запрограммировать распознавание нажатия клавиш PageUp и PageDown»
textual
Листинг программы
#include <stdio.h> #include <conio.h> using namespace std; int main() { char ch; while(true) { printf("<<"); ch = getche(); if(ch == 27) break; if(ch != 0) printf("\r\n"); } return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д