setcolor(FRONT_COL2);
rectangle(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);
outtextxy(MAX_X/2-MAX_X/(MENU_NUM*1.0)/2+5,MAX_Y/2+6,str);
outtextxy(MAX_X/2-MAX_X/(MENU_NUM*1.0)/2+5,MAX_Y/2+MENU_HEIGHT+6,"executed.");
}
//-------------------------------------------------
void draw_submenu(menutree *t,int x,int y){
setcolor(FRONT_COL2);
setfillstyle(1,FRONT_COL1);
bar(x,y,x+MAX_X/(MENU_NUM*1.0),y+(*t).numitem*MENU_HEIGHT);
rectangle(x,y,x+MAX_X/(MENU_NUM*1.0),y+(*t).numitem*MENU_HEIGHT);
for(int i=0;i<(*t).numitem;i++)
line(x,y+i*MENU_HEIGHT,x+MAX_X/(MENU_NUM*1.0),y+i*MENU_HEIGHT);
for(i=0;i<(*t).numitem;i++)
outtextxy(x+5,y+i*MENU_HEIGHT+6,(*t).caption[i]);
}
//-------------------------------------------------
//recursion used for realizing vertical submenus
int submenu(menutree *t,int x,int y,int level){
int end=0;
char ch;
int aitem=0,oldaitem=0;
draw_submenu(t,x,y);
move_active1(t,x,y,0,y,0);
while((ch=getch())!=27&&end==0){
switch(ch){
case 72:{//up arrow key
oldaitem=aitem--;
if(aitem<0)aitem=(*t).numitem-1;
move_active1(t,x,y+oldaitem*MENU_HEIGHT,oldaitem,y+aitem*MENU_HEIGHT,aitem);
break;
}
case 80:{//down arrow key
oldaitem=aitem++;
if(aitem>(*t).numitem-1)aitem=0;
move_active1(t,x,y+oldaitem*MENU_HEIGHT,oldaitem,y+aitem*MENU_HEIGHT,aitem);
break;
}
case 13:{//enter key
int xnew=0,ynew=0;
if((*t).submenu[aitem]!=NULL){
if(x+MAX_X/(MENU_NUM*1.0)<MAX_X-1)xnew=x+MAX_X/(MENU_NUM*1.0);
else xnew=x-MAX_X/(MENU_NUM*1.0);
ynew=MENU_HEIGHT*(aitem+2);
end=submenu((*t).submenu[aitem],xnew,ynew,2);
setfillstyle(1,BACK_COL);
bar(xnew,ynew,xnew+MAX_X/(MENU_NUM*1.0),ynew+(*((*t).submenu[aitem])).numitem*MENU_HEIGHT);
}
else{
execute((*t).caption[aitem]);
end=1;
}
}
case 17:{
execute("Clear");
getch();
end=1;
break;
}
}
}
return end;
}
//-------------------------------------------------
void draw_bottom(){
setcolor(FRONT_COL1);
line(0,MAX_Y-3*MENU_HEIGHT,MAX_X,MAX_Y-3*MENU_HEIGHT);
outtextxy(10,MAX_Y-3*MENU_HEIGHT+6,"This program developed by Markov Valery, NSTU, FAMI, PM-12.");
line(0,MAX_Y-2*MENU_HEIGHT,MAX_X,MAX_Y-2*MENU_HEIGHT);
outtextxy(10,MAX_Y-2*MENU_HEIGHT+6,"Press: Esc-Exit current menu. Enter-Execute menu element. Alt-W Clear.");
}
//-------------------------------------------------
int main(void){
int aitem=0,oldaitem=0;
char ch;
/* request auto detection */
int gdriver = DETECT, gmode;
/* initialize graphics mode */
initgraph(&gdriver, &gmode, "");
input();
setfillstyle(1,BACK_COL);
bar(0,0,MAX_X,MAX_Y);
draw_main_menu();
draw_bottom();
move_active(0,0);
while((ch=getch())!=27){
switch(ch){
case 77:{//right arrow key
oldaitem=aitem++;
if(aitem>MENU_NUM-1)aitem=0;
move_active(oldaitem,aitem);break;
}
case 75:{//left arrow key
oldaitem=aitem--;
if(aitem<0)aitem=MENU_NUM-1;
move_active(oldaitem,aitem); break;
}
case 13:{//enter key
submenu(mainmenu.submenu[aitem],aitem*MAX_X/(MENU_NUM*1.0),MENU_HEIGHT,1);
setfillstyle(1,BACK_COL);
bar(0,MENU_HEIGHT+1,MAX_X,MAX_Y);
draw_bottom();break;
}
case 17:{
execute("Clear");
getch();
setfillstyle(1,BACK_COL);
bar(0,MENU_HEIGHT+1,MAX_X,MAX_Y);
draw_bottom();break;
}
}
}
closegraph();
return 0;
}
Результаты и их анализ
§ Проведенное тестирование показало нормальную работу заявленных функций программы.
§ Записывание структуры меню в отдельном файле с определенным синтаксисом оказалось удобным для модификации программы под нужды заказчика.
§ Возможно сделать интерфейс пользователя с программой удобнее, реализуя поддержку мыши.
§ Горячие клавиши весьма удобны и их использование в программе можно расширить
§ Вполне можно сказать, что разработанное меню можно использовать в реальных программах.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.