Структура системы меню
Вариант ПМ1206
Программа и ее краткая характеристика
Разработанная программа представляет собой систему вложенных меню. Уровень вложенности может достигать 2. Заголовки меню моделируют меню некоторой абстрактной программы, но могут быть легко изменены в случае надобности. Отметим большое преимущество программы: вся структура меню может быть изменена посредством редактирования файла menu.dat. В данном файле структура меню записана со следующим синтаксисом:
<заголовок1>
(<элемент1>[(<элемент1.1>,<элемент1.2>[(<элемент1.2.1>)], ...)], ...)
<заголовок2>
(<элемент1>[(<элемент1.1>,<элемент1.2>[(<элемент1.2.1>)], ...)], ...)
...
то есть вложенность обозначается круглыми скобками.
Навигация по системе меню осуществляется с помощью клавиатуры.
Краткое руководство пользователя.
Меню расположено в верхней части экрана. Некоторый пункт меню в данный момент является активным, он выделен цветом. По главному меню можно перемещаться, используя клавиши – стрелки вправо и влево.
Для перехода в некоторое подменю перейдите к нему (сделайте его активным) и нажмите Enter. Если элемент меню содержит подменю оно откроется, иначе элемент меню будет выполнен, о чем вы узнаете по сообщению.
Из текущего меню можно выйти и перейти в вышестоящее (на дереве структуры) с помощью клавиши Esc. В главном меню Esc – выход из программы.
В программе действуют горячие клавиши: нажатие Alt-W вызовет выполнение элемента Clear.
Внешний вид программы
Исходный текст программы на языке Си
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<string.h>
#include<io.h>
#define BACK_COL 7
#define FRONT_COL1 1
#define FRONT_COL2 15
#define ACTIVE_COL 4
#define MENU_NUM 5
#define MENU_HEIGHT 20
#define MAX_X 639
#define MAX_Y 479
//-------------------------------------------------
struct menutree{
int numitem;
char caption[10][20];
menutree *submenu[10];
} mainmenu;
//-------------------------------------------------
void draw_main_menu(){
setcolor(FRONT_COL2);
setfillstyle(1,FRONT_COL1);
bar(0,0,MAX_X,MENU_HEIGHT);
rectangle(0,0,MAX_X,MENU_HEIGHT);
for(int i=0;i<MENU_NUM+1;i++)
line(i*(MAX_X/(MENU_NUM*1.0)),0,i*(MAX_X/(MENU_NUM*1.0)),MENU_HEIGHT);
for(i=0;i<MENU_NUM;i++)
outtextxy(i*(MAX_X/(MENU_NUM*1.0))+5,6,mainmenu.caption[i]);
}
//-------------------------------------------------
void fill_tree(menutree *t,char *str){
int num=0;
for(int i=0;i<(*t).numitem;i++)(*t).submenu[i]=NULL;//consider no submenu
strcpy((*t).caption[num],"");
while(*str!=')'){
if(*str=='('){
(*t).submenu[num]=new menutree;
fill_tree((*t).submenu[num],++str);
str=strchr(str,')');
//utilite block
str++;
continue;
}
if(*str==','){
num++;
strcpy((*t).caption[num],"");
str++;
}
strncat((*t).caption[num],str,1);
str++;
}
(*t).numitem=num+1;
}
//-------------------------------------------------
void input(){
FILE *in;
int num=0;
char str[255];
in=fopen("menu.dat","r");
while(!feof(in)){
fscanf(in,"%s",str);//input main menu caption
strcpy(mainmenu.caption[num],str);
fscanf(in,"%s",str);//input submenu's tree string
mainmenu.submenu[num]=new menutree;
fill_tree(mainmenu.submenu[num],&str[1]);
num++;
}
mainmenu.numitem=num;
fclose(in);
}
//-------------------------------------------------
void move_active(int a,int b){
setcolor(FRONT_COL2);
outtextxy(a*(MAX_X/(MENU_NUM*1.0))+5,6,mainmenu.caption[a]);
setcolor(ACTIVE_COL);
outtextxy(b*(MAX_X/(MENU_NUM*1.0))+5,6,mainmenu.caption[b]);
}
//-------------------------------------------------
void move_active1(menutree *t,int x,int y1,int i1,int y2,int i2){
setcolor(FRONT_COL2);
outtextxy(x+5,y1+6,(*t).caption[i1]);
setcolor(ACTIVE_COL);
outtextxy(x+5,y2+6,(*t).caption[i2]);
}
//-------------------------------------------------
void execute(char *str){
setfillstyle(1,FRONT_COL1);
bar(MAX_X/2-MAX_X/(MENU_NUM*1.0)/2,MAX_Y/2,MAX_X/2+MAX_X/(MENU_NUM*1.0)/2,MAX_Y/2+2*MENU_HEIGHT);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.