реклама на сайте
подробности

 
 
> Структура меню
sind-rom
сообщение Nov 15 2006, 17:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 21-10-06
Пользователь №: 21 540



Народ, как Вы делаете меню для своих девайсов? Интересует структура. Столкнулся с проблемой: вывод на дисплей (HD44780 совместимый) меню получается малопонятной и (главное) неприспособленный для добавления новых пунктов меню. Никогда раньше не приходилось делать меню, так что научите smile.gif Может у кого есть каки-нить наработки\библиотеки?
Заранее большое спасибо...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Unknown_User
сообщение Sep 9 2007, 18:18
Сообщение #2





Группа: Новичок
Сообщений: 11
Регистрация: 9-09-07
Пользователь №: 30 404



Очень интересная, а главная злободневная для меня тема, жаль что раньше не набрёл на этот форум )).
Меня интересует как вы решаете проблему размещения меню в памяти ? У меня сейчас всё меню создаётся при включении девайса и так там в памяти и висит. Для этих целей в прикрученой внешней оперативке под меню отведен килобайт памяти.
Ну и приведу схематично то что сделано у меня.
Требовалось создать иерархическое меню, причём в пунктах меню может быть что угодно от логотипа прибора и его настроек до отображения сигнала.
Первым делом объявляеться структурка. Эта структура сама по себе не используеться, но все остальные типы меню содержат точно такие же поля, объявленые в той же последовательности:
struct CustomMenu{
unsigned int ID;//номер, уникальный для каждого экземпляра меню
unsigned char Count;//количество подменю
unsigned char State;//текущее состояние меню
struct CustomMenu *Prev;//указатель на предыдущее меню, у главного меню равен NULL
struct CustomMenu **SubMenus;//массив указателей на подменю, на какое из этих подменю нужно //переходить видно по полю State
void ( *OnDraw )( struct CustomMenu *Menu );//указатель на функцию отрисовки
void ( *OnEvent )( struct CustomMenu *Menu, unsigned char Event );//указатель на функцию реакции на события
};
////////////
///
///////////
Далее создаются "потомки" этой структуры, например строчное меню:
struct StringMenu{
//поля "унаследованые" от CustomMenu:
unsigned int ID;//номер, уникальный для каждого экземпляра меню
unsigned char Count;//количество подменю
unsigned char State;//текущее состояние меню
struct CustomMenu *Prev;//указатель на предыдущее меню, у главного меню равен NULL
struct CustomMenu **SubMenus;//массив указателей на подменю, на какое из этих подменю нужно //переходить видно по полю State
void ( *OnDraw )( struct StringMenu *Menu );//функция отрисовки
void ( *OnEvent )( struct StringMenu *Menu, unsigned char Event );//функция реакции на события

//собственные поля
unsigned char **TextStrings;//строки меню; Текущая строка в меню определяеться полем State
};

Далее объявляем функции

void StringMenuOnDraw( struct StringMenu *Menu )//функция отрисовки StringMenu
{
}

void StringMenuOnEven( struct StringMenu *Menu, unsigned char Event );//функция реакции на события //StringMenu
{
}

При создании экземпляра StringMenu присваиваем его полям - указателям на функции соответствующие обработчики.

Здесь удобно то, что можно ко всем экземплярам меню обращаться так же, как к CustomMenu. Если теперь объявим переменную CustomMenu* CMenu и присвоим ей адрес созданного StringMenu *SMenu, то при выполнении кода СMenu->OnDraw( SMenu ); вызовется StringMenuOnDraw.

Добавление нвых элементов можно реализовать так:

void AddMenu( CustomMenu *Menu, unsigned char ID_Parent, unsigned char N_Child, unsigned char ID_Child );

где *Menu - указатель на главное меню; ID_Parent - ID экземпляра меню, в который хотим добавить новое меню: N_Child - номер нового меню в родительском ( по сути индекс нового экземпляра в массиве SubMenus родителя ); ID_Child - ID нового экземпляра меню.

В общем я привёл основную идею, в коде могут попасться и некоторые ошибки и очепятки, но думаю, вполне понятно что я имею в виду )).
Просьба большими кирпичами в меня не кидать и по голове не бить ; - ))
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sind-rom   Структура меню   Nov 15 2006, 17:36
- - junoSynthesizer   присоединяюсь к вопросу. тоже только начал стряпа...   Nov 15 2006, 22:00
- - bodja74   Делал двух-координатное меню. Создаем массив перем...   Nov 15 2006, 22:37
- - SergSit   Почитай тему на этом форуме : Отображение меня на ...   Nov 16 2006, 07:03
- - _Bill   Цитата(sind-rom @ Nov 15 2006, 20:36...   Nov 16 2006, 09:28
- - zltigo   До кучи. Код//------------------------------------...   Nov 16 2006, 09:39
- - Andy_F   Например, вот так: Кодstruct menu_item { unsigned...   Nov 16 2006, 09:42
- - alux   Продолжаем разговор... Считаю, что тема организаци...   Mar 28 2007, 10:21
- - beer_warrior   ЦитатаКак прикрутить данный проект к IAR (v.4.12A)...   Mar 28 2007, 10:44
- - alux   Забыл приложить файл... Я GCC не силен. Сделал сле...   Mar 28 2007, 12:11
- - MRW   Используем это MicroMenu. Вещь просто супер. Легко...   Mar 28 2007, 14:09
- - beer_warrior   ЦитатаError[Pe146]: too many initializer values D:...   Mar 28 2007, 14:29
|- - alux   Цитата(beer_warrior @ Mar 28 2007, 14:29)...   Mar 28 2007, 18:45
|- - Dog Pawlowa   Цитата(alux @ Mar 28 2007, 18:45) Вот лис...   Mar 28 2007, 19:25
|- - alux   Цитата(Dog Pawlowa @ Mar 28 2007, 19:25) ...   Mar 28 2007, 20:01
- - MRW   // Menus define: void KeySC (void); // Прототипы ф...   Mar 28 2007, 20:38
|- - alux   По поводу Micro-Menu... При попытке вызова SET_MEN...   Aug 7 2007, 10:58
- - alux   Первую ошибку можно обойти, указав размер массива ...   Mar 29 2007, 10:28
|- - IgorKossak   Цитата(alux @ Mar 29 2007, 10:28) Первую ...   Apr 1 2007, 22:10
|- - id_Alx   Цитата(alux @ Mar 29 2007, 13:28) Первую ...   Aug 28 2007, 18:13
|- - alux   ЦитатаДля IAR получилось так... У меня не получает...   Sep 27 2007, 15:19
|- - id_Alx   Цитата(alux @ Sep 27 2007, 18:19) В испра...   Oct 2 2007, 07:19
|- - alux   У меня меню заработало. Как теперь сделать, чтобы ...   Oct 3 2007, 18:53
- - Kolia   Выкладываю исходник простого и удобного меню для H...   Mar 30 2007, 13:59
- - beer_warrior   ЦитатаА вот со второй ошибкой не могу справится. В...   Mar 30 2007, 14:44
- - Яrik   Только сильно не ругайте: Решил попробывать код пр...   Jul 13 2007, 14:44
|- - IceS   Цитата(Яrik @ Jul 13 2007, 18:44) но чего...   Jul 16 2007, 21:43
- - admiral   Продолжу тему. У меня возникла необходимость созда...   Apr 8 2008, 11:24
- - sKWO   Цитата(admiral @ Apr 8 2008, 14:24) Код#d...   Apr 8 2008, 12:16


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016