С для профессиональных программистов


Ввод выбора пользователя


Как утверждалось, пользователь может вводить выбор одним из двух способов. Во-первых с помощью клавиш СТРЕЛКА ВНИЗ и СТРЕЛКА ВВЕРХ может переместить освещение на строку и нажать Ввод для ее выбора, (Обычно освещение строки выполняется в инверсном режиме.) Освещенную строку также можно передвигать пробелом. Второй способ это нажатие клавиши, связанной с выбором. Функция get_resp(), показанная здесь, достигает этих целей.

/* ввести выбор пользователя */

int x,y,count;

char *keys;

y++;

goto_xy(x,y);

write_video(x,y,menu[0],REV_VID);

/* вернуть выбор в номальный режим */

write_video(x+arrow_choice,y,

menu[arrow_choice],norm_vid);

if(key_choice) return key_choice-1;

else  /* специальная клавиша */

switch(c.ch[1])



case 72 : arrow_choice--; /* стрелка вниз */

break;

case 80 : arrow_choice++; /* стрелка вверх */

break;

if(arrow_choice<0) arrow_choice=count-1;

/* подсветить выбранную опцию */

goto_xy(x+arrow_choice,y);

write_video(x+arrow_choice,y,menu[arrow_choice],REV_VID);

 

Kогда get_resp() начинает выполняться, освещается первое значение меню. Макроопределение REV_VID определяется везде, как 70Н, а NORM_VID как 7Н. Клавиша ESCAPE используется для окончания работы с меню. Значение ESC 27. После этого программа входит в цикл, ожидающий действий пользователя. Она использует функцию bioskey() для того, чтобы дождаться нажатия клавиши, а затем для считывания с этой клавиши. Функция bioskey() специфична для Турбо Си. Если вы используете другой транслятор, вы можете использовать следующую версию функции.

/* эмуляция части функции bioskey Турбо Си */

int c;

get_key()

void write_video(x,y,p,attrib)

char *p;

union REGS r;

register int i,j;

for(i=y; *p; i++)

goto_xy(x,i);

r.h.ah=9; /* функция записи символа   */

r.h.bh=0; /* видео страница           */

r.x.cx=1; /* число повторений символа */

r.h.al=*p++; /* символ          */

r.h.bl=attrib; /* атрибут                                                */

int86(0x10,&r,&r);

Функция is_in() возвращает позицию "горячей" клавиши в строке. Если пользователь нажал не ключевую клавишу, то is_in возвращает 0.

is_in(s,c)

register int i;

for(i=0; *s; i++)

if(*s++ == c) return i+1;

return 0;



Содержание раздела