Вот например вариант
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Al Volovich 01 декабря 2005 г. 10:27
В ответ на: MENU отправлено <font color=gray>M@RS</font> 30 ноября 2005 г. 21:20


Простой, но эффективный вариант. Пункты меню хранятся в следующей структуре:
typedef struct TMenuItem{
char code* Caption; //название пункта меню
void (code*Exec)(void); //функция, вызываемая при выборе
struct TMenuItem code* Next; //следующее меню
};

Сами меню хранятся в массивах. Например:
const struct TMenuItem code* code ParamMenu[]={
&ParamMenu1,
&ParamMenu2,
&ParamMenu3,
&ParamMenu4,
&ParamMenu5,
0,
MainMenu
};
Здесь ParamMenu - пункты меню, 0 - индикатор конца меню, MainMenu - массив меню, к которому переходим по нажатию Esc (предыдущий уровень).
Пункты меню описываются следующим образом:
const struct TMenuItem code ParamMenu1={"Название",&FreqInput,0};
FreqInput - функция, вызываемая при выборе пункта меню. Для пункта, имеющего подменю описание следующее:
const struct TMenuItem code MainMenu1={"Параметры",0,ParamMenu};
Сначала описываются все пункты и массивы меню. После этого программа с ними работает, и ей без разницы, что это за пункты, сколько их, и какой уровень вложенности они имеют. Заводится одна переменная
struct TMenuItem code*code* CurMenu; //указатель на текущее меню
и меняется в зависимости от действий пользователя. Никаких проблем с вложенностью и возвратами не возникает.
Следующее меню (подменю) берется так:
CurMenu = (struct TMenuItem code*code*)CurMenu[SelPos]->Next;
где SelPos - позиция полоски выделения
Переход к предыдущему меню делается так:
CurMenu = (struct TMenuItem code*code*)CurMenu[ItemCnt+1];
где ItemCnt - кол-во пунктов меню, которое легко посчитать по ненулевым элементам массива.
Вызов функции, закрепленной за пунктом меню
(*(CurMenu[SelPos]->Exec))();


Составить ответ  |||  Конференция  |||  Архив

Ответы



Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru