Листинг 4

Предыдущая  Содержание  V*D*V

Расширенное меню управления.

 

typedef struct _medium_menu

{

    int id;

    int num_selections;

    SELECTION selection[12];

}MEDIUM_MENU;

 

typedef struct _small_menu

{

    int id;

    int num_selections;

    SELECTION selection[6];

}SMALL_MENU;

 

typedef struct _tiny_menu

{

    int id;

    int num_selections;

    SELECTION selection[3];

}TINY_MENU;

 

/* Это несколько усложняет функцию goto_menu, но не намного */

void goto_menu /* Установить и отобразить активное меню */

(

    int new_menu_id /* идентификатор нового меню */

)

 

{

    MENU * menu;

    int i,j;

    extern MENU * curr_menu;

    menu = findmenu(new_menu_id);

    if(menu == NULL)

    {

        /* ошибка системы */

    }

    else

        curr_menu = menu; /* здесь curr_menu является глобальной или внешней переменной */

    draw_menu();

    return;

}

////////////////////////////////////////

MENU * findmenu

(

    int new_menu_id /* идентификатор нового меню */

)

{

    MENU * ptr;

    int i,j;

 

    /** сначала попытаться найти меню в списке больших меню **/

    for(i = 0; i < MENU_END; i++)

    {

        if(new_menu_id == menu[i].menu_id)

        {

            ptr = (MENU *)&menu[i];

            break;

        }

    }

 

    /** если не нашли, пробуем найти меню в списке коротких меню **/

    if(new_menu_id >= MENU_END)

    {

        for(i=MENU_END+1,j=0; i<MEDIUM_MENU_END; i++, j++)

        {

            if(new_menu_id == medium_menu[j].menu_id)

            {

                ptr = (MENU *)&medium_menu[j];

                break;

            }

        }

        if(new_menu_id >= MEDIUM_MENU_END)

        {

            for(i = MEDIUM_MENU_END+1, j = 0; i < SHORT_MENU_END; i++, j++)

            {

                if(new_menu_id == short_menu[j].menu_id)

                {

                    ptr = (MENU *)&short_menu[j];

                    break;

                }

            }

            if(new_menu_id >= SHORT_MENU_END)

            {

                for(i=SHORT_MENU_END+1,j=0;i < TINY_MENU_END; i++, j++)

                {

                    if(new_menu_id == tiny_menu[j].menu_id)

                    {

                        ptr = (MENU *)&tiny_menu[j];

                        break;

                    }

                }

 

                /** ошибка, если в двух списках соответствия не найдено **/

                if(new_menu_id >= TINY_MENU_END)

                {

                    return(NULL);

                }

            }

        }

    }

    return(ptr);

}

 

Предыдущая  Содержание