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


Общий обзор


Простая программа, показанная здесь, использует все программы, разработанные для использования исчезающих меню. Вы не видели только функции cls(), которая очищает экран. Некоторые трансляторы Си не имеют функции для этого, и если это так, то вы не можете использовать следующую программу (в чистом виде).

/* процедура исчезающего меню для работы в текстовом режиме */

#include "dos.h"

#include "stdlib.h"

#define ESC 27

void save_video(),restore_video();

char *fruit[] =

"Яблоко",

"Апельсин",

"Груша",

"Грейпфрут",

"Малина",

"Клубника"



char *color[]=

"Красный",

"Желтый",

"Оранжевый",

"Зеленый"

char *apple_type[] =

"Красный деликатес",

"Джонатан",

"Белый налив",

"Антоновка"

main()

cls();

for(i=0;i<25;i++)

printf("Это тест исчезающего меню\n");

popup(color,"кжоз",4,5,10,BORDER);

int popup(menu,keys,count,x,y,border)

char *menu[];               /*    текст меню */

char *keys;                   /*    горячие клавиши */

int count;                       /*    число альтернатив */

int x,y;                            /*    координаты левого верхнего угла */

int border;                     /*    если 0 то без рамки */

/* вычисление размеров */

for(i=0;i<count;i++)

if(strlen(menu[i]) > len) len=strlen(menu[i]);

endx=count+1+x;

p=(unsigned int *)malloc((endx-x+1)*(endy-y+1));

if(!p) exit(1); /* Вы можете здесь сами обработать ошибку */

/* высвечивание меню на своем месте */

void display_menu(menu,x,y,count);

/* восстановление части экрана */

free(p);

return choice;

void display_menu(menu,x,y,count)

int x,y,count;

for(i=0;i<count;i++,x++)

goto_xy(x,y);

printf(menu[i]);

int   startx,starty,endx,endy;

goto_xy(i,starty);

goto_xy(i,endy);

goto_xy(startx,i);

goto_xy(endx,i);

goto_xy(startx,starty); putchar(218);

goto_xy(endx  ,starty); putchar(192);


get_resp(x,y,count,menu,keys)

char *menu[];

union inkey

char ch[2];

int i;

 c;

int arrow_choice=0,key_choice;

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==count) arrow_choice=0;

/* вывод строки с определенным атрибутом */

int x,y;

int attrib;

void save_video(startx,endx,starty,endy,buf_ptr)

unsigned int *buf_ptr;

void restore_video(startx,endx,starty,endy,buf_ptr)

unsigned int *buf_ptr;

void cls()

Вводите эту программу в ваш компьютер и запускаете ее. В ходе ее выполнения каждое меню будет высвечено и исчезнет. (В этой программе все ответы теряются, но реальное применение будет, конечно, их обрабатывать.) Даже если ваш компьютер очень быстрый, вы возможно заметите, что исчезновение и появление меню требуют определенной задержки. Единственный путь решения этой проблемы - читать и писать символы прямо в видео память, что и обсуждается в следующем разделе. Еще раз отметим, что единственное важное достоинство использование BIOS в том, что такие меню работают на любом компьютере, который поддерживает BIOS, совместимый с IBM, даже если компьютер не 100% совместимый.


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