На сях сговнякал меню на вот такой структуре: struct t_m_line
{
const unsigned char * str; // Указатель на строку
struct t_m_line *child[4]; // Массив указателей на потомков
unsigned char type; // Тип элемента
unsigned char level; // Уровень ветки
unsigned char x; // Параметр
unsigned char min, max; // Мин и макс. значения параметра
unsigned int X; // Координата X всяких значков типа чекбоксов, радиобатонов
char pict; // Пиктограмма
};
Каждый элемент меню представлен этой структуой.
Поля:
str - текст, соответствующий этому элементу меню
child[] - указывает на потомков - элементы подменю следующего уровня, размер массива определяет максимальное кол-во элементов на одном уровне меню
type - тип элемента из примерно такого набора:
type_text - Просто строка текста
type_branch - Ветка
type_CheckBox - Лист с CheckBox
type_RadioButton - Лист с RadioButton
type_unsig - Лист с числом без знака
type_sig - Лист с числом со знаком
type_exit - Выход
type_back - Назад
и т.п.
level - уровень ветки, используется для переходов "вверх", если type == type_branch, а одним из потомков указан родитель
x - некий числовой параметр, например состояние чекбокса и т.д.
min, max - границы параметра x, в которых он может меняться
X - используется для наведения красоты путем выравнивания значков, соответствующих элементам меню
pict - пиктограмма
Для любого элемента обязательны str и type, остальное варируется в зависимости от типа элемента
Собственно структура меню задается описанием каждого из его элементов, примерно так:
Главное меню:
struct t_m_line main_m = {.type = type_branch, .level = 0, .child = {&ind_m, &sound_m, &measuring_m, &exit_m}};
Ветка главного меню:
struct t_m_line ind_m = {.type = type_branch, .level = 1, .str = ind_str, .child = {&trace_m, &probe_m, &bright_m, &main_m}};
Следующее вложение:
struct t_m_line bright_m = {.type = type_unsig, .str = bright_str, .min = min_bright, .max = max_bright, .X = 190};
Ещё всякие другие примеры:
struct t_m_line tone_m = {.type = type_RadioButton, .str = tone_str, .x = 1, .X = 180};
struct t_m_line auto_m = {.type = type_CheckBox, .str = auto_str, .X = 259};
struct t_m_line back_m = {.type = type_back, .str = back_str};
Память под меню можно немного сэкономить, если некоторые поля структуры t_m_line засунуть в union. Я заморачиваться не стал.