Как запрограммировать распознавание нажатия клавиш 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;
}