Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
11
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

3. Иерархическое меню

Меню, в котором по крайней мере одна из опций содержит подменю, называется иерархическим. Оно отличается от исчезающего меню тем, что исчезающее меню имеет один уровень вложенности в глубину, а иерархическое – больше одного уровня.

3.1. Фреймы меню

Фреймом меню называется структура, содержащая указатель на область сохранения и массив строк меню, координаты углов прямоугольника, являющегося областью вывода, количество опций меню и дополнительную информацию. Каждому подменю иерархического меню соответствует один фрейм. Для создания иерархического меню определяется массив фреймов:

struct menu_frame

{

int startx, starty, endx, endy ; // координаты углов

unsigned char *p ; //указатель на область сохранения

char *menu [] ; //массив строк подменю

int border ; //рамка включена / выключена

int count ; //число опций

int active ; // 1- активно меню, 0 – нет

int horizont ; // 1- горизонтальная линейка

// 0 – вертикальное меню

} frame [MAX_FRAME];

если frame[i]. horizont = 0, то меню выводится в виде строк текста, расположенных сверху вниз. Если frame[i]. horizont = 1, то опции меню расположены в одну линию, слева направо.

Всем меню, входящим в иерархическое меню, присваиваются номера. Меню, имеющему номер i, ставится в соответствие i-й элемент массива фреймов. В главной программе поля фреймов заполняются с помощью функции, первым аргументом которой является номер фрейма, а остальные аналогичны аргументам функции popup() исчезающего меню. Последний параметр указывает, будет ли меню горизонтальным. Эта функция определяет также свободную память для сохранения области вывода.

int make_menu (int num, //номер фрейма

char *menu[], //список опций

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

int count, //число опций

int x, int y, //левый верхний угол

int border, //рамка есть/нет

int horizont)

{

register int i, len;

int endx, endy, choice, vmode;

unsigned char *p; //указатель на область сохранения

if (num > MAX_FRAME)

{

printf(“Слишком много меню”);

return 0;

}

if ((x > 79)||(x < 0)||(y > 24)||(y < 0))

{

printf(“Выход за пределы экрана”);

return -2;

}

len=0; //вычисление размеров меню

if (horizont) //если горизонтальное, то ширина равна

{ //сумме длин опций

for (i=0; i < count; i++) len+=strlen(menu[i]); }

else //иначе максимуму длин строк

{

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

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

len=strlen(menu[i]);

}

endx=len+x+1;

if((endx > 79)||(endy > 24))

{

printf(“Выход за пределы экрана”);

return –2;

}

p=(unsigned char*) malloc((len+2)*(count+2)*2);

//захват свободной памяти

if(!p)

{

printf(“Не хватило памяти”);

exit(1);

}

/*далее идет заполнение фрейма*/

frame[num].startx = x;

frame[num].endx = endx;

frame[num].starty = y;

frame[num].endy = endy;

frame[num].p = p;

frame[num].menu = (char**)menu;

frame[num].border = border;

frame[num].keys = keys;

frame[num].count = count;

frame[num].active = 0

frame[num].horizont = horizont;

return 1;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]