Интерфейс пользователя при построении системного ПО. Структура системы меню, страница 4

       outtextxy(12,456,"Use arrow keys to movement, 'Enter' to execute");

       while(key!=Esc)

       {

              key = bioskey(0); good_key = 1;

              Cur->Item->Selected = 0;

              old = Cur;

              switch (key)

              {

                     case Left     : if (Cur->Item->Main) Cur = Cur->prev;

                                                                else if (Cur->Item->Parent)

                                                                Cur = Cur->Item->Parent; else

                                                                       good_key = 0; break;

                     case Right: if (Cur->Item->Main) Cur = Cur->next;

                                                                else if (Cur->Item->Children)

                                                                Cur = Cur->Item->Children; else

                                                                       good_key = 0; break;

                     case Up   : Cur = Cur->prev; break;

                     case Down : if ((Cur->Item->Main)&&(Cur->Item->Children))

                                                                Cur = Cur->Item->Children;

                                                                else Cur = Cur->next; break;

                     case Enter:   if (Cur->Item->Children)

                                                                Cur = Cur->Item->Children;

                                                                else {bar(250, 220, 395, 265);

                                                                rectangle(249, 219, 396, 266);

                                                         outtextxy(260, 230, "You Execute");

                                                         outtextxy(260, 240, Cur->Item->Name);

                                                  outtextxy(260, 250, "Press any key...");

                                                                bioskey(0); setfillstyle(0,0);

                                                                bar(249, 219, 396, 266);}

                                                                break;

                     default              : good_key = 0;

              }

              Cur->Item->Selected = 1;

              if (good_key)

              {

                     Erase_Tree(old);

                     Paint_Tree(Cur);

              }

       }

}

void main()

{

       int gdriver = DETECT, gmode;

       initgraph(&gdriver, &gmode, "");

       Main_Menu M("Menu 1{Menu 11,Menu 12>{Menu 121,Menu 122},Menu 13>{Menu 131,Menu 132,Menu 133,Menu 134},Menu 14,Menu 15>{Menu 151,Menu 152,Menu 153,Menu 154}},Menu 2{Menu 21>{Menu 211,Menu 212,Menu 213},Menu 22>{Menu 221,Menu 222,Menu 223,Menu 224},Menu 23,Menu 24},Menu 3{Menu 31,Menu 32,Menu 33>{Menu 331,Menu 332,Menu 333,Menu 334}},Menu 4{Menu 41,Menu 42,Menu 43>{Menu 431,Menu 432,Menu 433,Menu 434},Menu 44>{Menu 441,Menu 442,Menu 443,Menu 444,Menu 445},Menu 45>{Menu 451,Menu 452}},Menu 5{Menu 51>{Menu 511,Menu 512},Menu 52,Menu 53>{Menu 531,Menu 532,Menu 533},Menu 54,Menu 55,Menu 56>{Menu 561,Menu 562}},Menu 6{Menu 61,Menu 62>{Menu 621,Menu 622,Menu 623},Menu 63>{Menu 631,Menu 632,Menu 633}}");

       M.Process();

       closegraph();

}

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

Программа является полностью работоспособной, и ее тестирование не выявило ошибок. Реализация меню на основе классов и возможность построения меню любой вложенности позволяют использовать разработанные классы в других (реальных, а не учебных) программах для организации пользовательского интерфейса. Возможно, было бы удобнее, если сделать поддержку мыши. Также опыт показал, что размещение структуры меню во внешнем файле не имеют смысла, т.к. в реальных программах меню является, как правило, статическим, за редким исключением. Возможно было написать эту работу под ОС Windows,  но это было бы не слишком полезным, т.к. API этой ОС итак позволяет строить меню любой сложности. К сожалению, основную часть кода в программе занимает строковый анализатор, который из начальной строки строит всю структуру меню. Программу можно было бы значительно сократить оптимизировав эту часть кода.