Разработка программы, представляющей собой систему вложенных меню

Страницы работы

Содержание работы

Структура системы меню

Вариант ПМ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);

Похожие материалы

Информация о работе