Как запрограммировать распознавание нажатия клавиш PageUp и PageDown - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, уважаемые обыватели КиберФорума. Заканчивая работу над курсовым проектированием, приступил к отладке программы (задача программы - работа с информацией - добавление, удаление, редактирование, просмотр, сохранение в выходной форме) и решил, что листинг таблицы сотрудников, который сделал я (пример - ниже), не очень-то подойдёт для работы со списками в 500-1000 сотрудников (прокрутка осуществляется при помощи клавиш 'вверх' и 'вниз' - при этом справа от таблицы появляется курсор-бегунок, который указывает на конкретный элемент - и листать таблицу таким образом, чтобы дойти, допустим, до 755 сотрудника, будет не совсем удобно, да и времени займёт немало). Поэтому я решил добавить 2 дополнительных цикла 'case' с клавишами PageUp и PageDown (которые, соответственно, обеспечивали бы полистовую прокрутку - за одно нажатие таблица бы переходила к очередному набору сотрудников. Поскольку пишу программу я на Си, а экран DOS ограничен по-вертикали, пришлось ограничить количество выводимых элементов (сотрудников) до 18 (остальное пространство - вывод 'шапки' и 'подвала' таблицы). Суть моего вопроса: как запрограммировать распознавание нажатия клавиш PageUp и PageDown (в данный момент всё, что я знаю - это: клавиша 'вниз' - код '80', клавиша 'вверх' - '72', клавиша 'Escape' - '27') Заранее всем заглянувшим и откликнувшимся большое спасибо. Жду ваших ответов... P.S.: вот, собственно, исходник процедуры просмотра таблицы:
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' - выйти из процедуры просмотра таблицы*/
    }
    }
  }
}
};
P.S.S.: 2 скрина - первый - просто таблица, второй - таблица с тем самым курсором-бегунком.

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы