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

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;

}


Результаты и их анализ

§  Проведенное тестирование показало нормальную работу заявленных функций программы.

§  Записывание структуры меню в отдельном файле с определенным синтаксисом оказалось удобным для модификации программы под нужды заказчика.

§  Возможно сделать интерфейс пользователя с программой удобнее, реализуя поддержку мыши.

§  Горячие клавиши весьма удобны и их использование в программе можно расширить

§  Вполне можно сказать, что разработанное меню можно использовать в реальных программах.