Листинг 4 |
Предыдущая Содержание |
Расширенное меню управления.
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); }
|
Предыдущая Содержание |