Насчет стандартных не знаю, делал так:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Сидоргек 14 апреля 2004 г. 12:23
В ответ на: Какие есть стандартные подходы реализации пользовательского меню? отправлено Paramedic 14 апреля 2004 г. 11:54

Каждый пункт меню описывается вот такой структурой (все было написано на CodeVisionAVR):

typedef flash struct _menu_pos
{
flash char name[16];
flash struct _menu_pos * flash top;
flash struct _menu_pos * flash prev;
flash struct _menu_pos * flash next;
flash struct _menu_pos * flash sub;
void(* keyb_proc)(unsigned char);
void(* value_print)(void);
void(* on_enter)(unsigned char);
void(* on_exit)(unsigned char);
} MENU_POS;

В структуру забиты указатели на функции отображения и работы с клавой этого пункта, функции, которые вызываются при входе и выходе в/из пункт и указатели на структуры соседних пунктов меню.

В программе объявлен указатель на текущий пункт меню:

flash struct _menu_pos * last_menu = &menu_mod;

Навигация производится таким образом:

static void MenuOnKey (unsigned char key)
{
// Îáðàáàòûâàþ êíîïêè íàâèãàöèè
switch (key)
{
case BT_LEFT:
if (last_menu->prev == NULL) break;

if (last_menu->on_exit) // Äåéñòâèÿ ïî âûõîäó èç ïóíêòà ìåíþ
{
(* last_menu->on_exit)(key);
}

last_menu = last_menu->prev; // Ïðåäèäóùèé ïóíêò ìåíþ

if (last_menu->on_enter) // Äåéñòâèÿ ïî âõîäó â ïóíêò ìåíþ
{
(* last_menu->on_enter)(key);
}
break;

case BT_RIGHT:
if (last_menu->next == NULL) break;

if (last_menu->on_exit) // Äåéñòâèÿ ïî âûõîäó èç ïóíêòà ìåíþ
{
(* last_menu->on_exit)(key);
}

last_menu = last_menu->next; // Ñëåäóþùèé ïóíêò ìåíþ

if (last_menu->on_enter) // Äåéñòâèÿ ïî âõîäó â ïóíêò ìåíþ
{
(* last_menu->on_enter)(key);
}
break;

case BT_ENTER:
if (last_menu->sub == NULL) break;

last_menu = last_menu->sub; // Íà óðîâåíü íèæå`

if (last_menu->on_enter) // Äåéñòâèÿ ïî âõîäó â íîâûé ïóíêò ìåíþ
{
(* last_menu->on_enter)(key);
}
break;

case BT_ESC:

if (last_menu->on_exit) // Äåéñòâèÿ ïî âûõîäó èç ïóíêòà ìåíþ
{
(* last_menu->on_exit)(key);
}

if (last_menu->top == &menu_top)
{
menu_timer = MTIM_STAT; // Âûõîä èç ìåíþ
}
else
{
last_menu = last_menu->top; // Íà óðîâåíü âûøå
}
break;
}

// Åñëè åñòü ðåãóëèðóþùàÿ ôóíêöèÿ - ïåðåäàþ êíîïêó åé
if (last_menu->key_proc)
{
(* last_menu->key_proc)(key);
}
}

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

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru