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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Embedded GUI, Что поизучать?
mdmitry
сообщение Sep 13 2012, 20:09
Сообщение #46


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(dxp @ Sep 13 2012, 18:00) *
Ага, вроде, понял. Типа, нужно менять и отрисовывать виджеты по цепочке. Модель, как я понимаю, выглядит следующим образом. Есть Список1, в котором некоторое количество пунктов. Каждый пункт имеет связь с другим объектом Список2. Аналогично, каждый пункт у объекта типа Список2 имеет связь с объектом типа Список3. Вопрос в том, как связать пункты и их объекты списков.

Что-то в таком виде:
Код
[/code]
картофель-> резать кубиками    -> отварить
                                                  жарить
                                                  заморозить                
                   резать ромбиками ->  жарить
                                                  отварить
                   резать параллелепипедами -> жарить
                                                              заморозить
                                                              запечь
морковь   -> резать кубиками   ->  отварить
                                                  жарить
                                                  заморозить

                  резать кружочками - > отварить
                                                  заморозить
                  резать вдоль          -> заморозить
                                                  консервировать
огурец     -> резать кружочками -> консервировать
                                                  ничего не делать
                  резать вдоль          -> консервировать
                                                  ничего не делать
                  не резать    ->           консервировать
                                                  ничего не делать

Список1: картофель морковь огурец
Список2: зависит от элемента Списка1
Список3: зависит от элемента Списка2

Интересно, как организовать в этом случае данные эффективно?
Я организовывал каждый из списков через структуры с массивами и указателями для взаимосвязи. Не очень удобно.

Цитата
А кто отвечает за собственно внешний вид виджетов? Их размеры, цвета и прочее.

Я говорил об идее организации, а не о реализации. В приведенной ссылке реализована отрисовка только графических приметивов. Скорее всего, нужны классы графических элементов (эдитбоксы, листбоксы и т.д.), информационная часть в которых определяется ссылкой на соответствующий объект, а внешний вид - желаниями разработчика и возможностями графического экрана.

Это предмет для критики, обсуждения.
Мне GUI не приходилось разрабатывать, поэтому есть желание узнать как эффективно решить задачу.

add: _Pasha, спасибо за тэги.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 13 2012, 20:39
Сообщение #47


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(dxp @ Sep 8 2012, 08:29) *
...
Код
void gui::TWidget::on_message(TBaseMsgWrapper *msg_wrp)
{
    gui::TInputMessage *msg = check_msg<gui::TInputMessage>(msg_wrp);   // проверяется соответствие типа сообщения, 0 возвращает, если не соответствует
    
    if(msg)
    {
        switch(*msg)
        {
        case gui::imENTER : enter(); break;
        case gui::imBACK  : back();  break;
        case gui::imHELP  : help();  break;
        case gui::imNEXT  : next();  break;
        case gui::imPREV  : prev();  break;
        default           : print("error: unknown message");
        }
    }
}

...


маленькое ОФФ-топ замечание-предложение.
Поймите только правильно - я проходил мимо беседы, дабы не размывать инфу основанной на вашем опыты. но конструкция свитч-кэйс основанная на обращении к базовому классу - мягко говоря избыточна (скажем не строго) в некоторых архитектурах кода. хочу обратить ваше внимание - что ВТД уже есть переход на нужный обработчик. и если это задействовать, то код будет состоять из одной строчки - вызов обработчика у базового класса. при этом если виртуальные функции перегружены для каждого типа - вы получите переход на чётко свой обработчик с чёткой типизацией участников события(мессэдж-виджете-метод).

этот и другие замечательние языковые(не относящиеся к ООА и ООП) приёмы не плохо изложен в книге Джефа Элджера "C++". Чёрная такая обложечка. Если не смотрели - рекомендую почитать.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 14 2012, 06:14
Сообщение #48


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (mdmitry @ Sep 14 2012, 03:09) *
Что-то в таком виде:
картофель-> резать кубиками -> отварить
жарить
заморозить
резать ромбиками -> жарить
отварить
резать параллелепипедами -> жарить
заморозить
запечь

Список1: картофель морковь огурец
Список2: зависит от элемента Списка1
Список3: зависит от элемента Списка2

Интересно, как организовать в этом случае данные эффективно?
Я организовывал каждый из списков через структуры с массивами и указателями для взаимосвязи. Не очень удобно.

Как-то не очень понятно, почему разнокачественные вещи в одном списке: картофель, резать ромбиками, отварить. Я так понимаю, что элементы первого списка: картофель, морковь, огурец; элементы второго списка: резать кубиками, резать ромбиками, резать параллелепипедами; элементы третьего списка: жарить, варить, заморозить, запечь.

Если оно так, то всё получается достаточно логично.

Список1.добавить_элемент(картофель)
Список1.добавить_элемент(морковь)
Список1.добавить_элемент(огурец)

Список2_1.добавить_элемент(резать_кубиками)
Список2_2.добавить_элемент(резать_ромбиками)
Список2_3.добавить_элемент(резать_параллелепипедами)

Список2_1.добавить_элемент(резать_колёсиками)
Список2_2.добавить_элемент(резать_соломкой)
Список2_3.добавить_элемент(шинковать_колечками)


Список3_1.добавить_элемент(жарить)
Список3_1.добавить_элемент(варить)
Список3_1.добавить_элемент(парить)

Список3_2.добавить_элемент(морозить)
Список3_2.добавить_элемент(парить)
Список3_2.добавить_элемент(жарить)

картофель.назначить_цель(Список2_1)
морковь.назначить_цель(Список2_2)
огурец.назначить_цель(Список2_1)

Правда, тут я вот вижу уже нестыковку - линковать Список3 на элементы Списка2 как-то нелогично, а логично Список3 линковать на элементы, опять же, Списка1. Т.е. картофель->варить, а не резать_кубиками->варить. Т.е. тут над дизайном подумать надо. Но механизм связывания пунктов списков с их целями остаётся таким же. Как это делается по коду, приведено в предыдущем моём посте.


QUOTE (kolobok0 @ Sep 14 2012, 03:39) *
конструкция свитч-кэйс основанная на обращении к базовому классу - мягко говоря избыточна (скажем не строго) в некоторых архитектурах кода.

А где вы видите "свитч-кэйс" при обращении к базовом классу?

QUOTE (kolobok0 @ Sep 14 2012, 03:39) *
хочу обратить ваше внимание - что ВТД уже есть переход на нужный обработчик. и если это задействовать, то код будет состоять из одной строчки - вызов обработчика у базового класса. при этом если виртуальные функции перегружены для каждого типа - вы получите переход на чётко свой обработчик с чёткой типизацией участников события(мессэдж-виджете-метод).

Что такое ВТД?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 14 2012, 07:55
Сообщение #49


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(dxp @ Sep 14 2012, 10:14) *
Как-то не очень понятно, почему разнокачественные вещи в одном списке: картофель, резать ромбиками, отварить. Я так понимаю, что элементы первого списка: картофель, морковь, огурец; элементы второго списка: резать кубиками, резать ромбиками, резать параллелепипедами; элементы третьего списка: жарить, варить, заморозить, запечь.

Если оно так, то всё получается достаточно логично.

Список1.добавить_элемент(картофель)
Список1.добавить_элемент(морковь)
Список1.добавить_элемент(огурец)

Так у меня также и написано в сообщении
Цитата
Список1: картофель морковь огурец

Отобразилось неправильно на форуме, пробелы для выравнивания исчезли. Причем при редактировании всё выравнивание пробелами есть.

P.S. Вопрос к модераторам или администраторам: как правильно делать сообщение, чтобы введенные пробелы отображались корректно.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 14 2012, 09:37
Сообщение #50


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(mdmitry @ Sep 14 2012, 10:55) *
P.S. Вопрос к модераторам или администраторам: как правильно делать сообщение, чтобы введенные пробелы отображались корректно.

Я ни тот ни этот, но знаю: теги code и /code как раз на этот случай
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 14 2012, 10:47
Сообщение #51


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(dxp @ Sep 14 2012, 10:14) *
...А где вы видите "свитч-кэйс" при обращении к базовом классу?..Что такое ВТД?


конструкцию Вашего кода я в комментах оставил.

очепятался. имелось ввиду виртуальная таблица.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 14 2012, 12:31
Сообщение #52


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (kolobok0 @ Sep 14 2012, 17:47) *
конструкцию Вашего кода я в комментах оставил.

Да, я видел. Так где там "свитч-кэйс" при обращении к базовом классу? Конкретно код приведите, который имеете в виду? Где там базовый класс? Где к нему обращение? И базовый класс чего?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 3 2012, 05:58
Сообщение #53


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



У меня вырисовывается следующая концепция.

Иерархия виджетов общепринятая. Здесь вопросов нет.

Но виджеты (как мне кажется) не могут существовать сами по себе (создаваться, исчезать), т.е. нужен некий оконный менджер, пусть и однопоточный.

У меня это некий виджет, унаследованный от базового FDesktop, который на эране отрисовывает фоновую картинку, кнопочки по бокам экрана (там есть физические кнопки, тачскрин не приклеен) Тут как это примерно выглядит.( На звук не обращайте внимание. Забыл телевизор выключить.)

В общем сейчас там одно окно отрисовывается, но это сделано "в лоб".

Хочется упорядоченности.

У меня появилась мысль. Окна все заранее конструируются (как, например в QT).

В классе виджета FDesktop есть "пул" на некоторое количество базовых виджетов, примерно так
CODE
class FDesktop : private FWidget, ....
{
public:
...

private:
FWidget* widgetPool[ 100 ];
};


В этом пуле хранятся адреса всех виджетов, которые создаются и уничтожаются в процессе работы (не принадлежат рабочему столу). Кнопки, часики, обои - это все принадлежит рабочему столу.

У рабочего стола вызывается метод его отриосвки desktop.draw() с некоторой периодичностью, который "смотрит" в пул, и если там есть указатели не на нулевые адреса "активных, под фокусом" виджетов, то вызывает их методы draw().

Если есть сообщение от именно клавиатуры, то оно приходит виджету под фокусом (тут вроде без исключений, т.к. пользователь работает с "текущим" окном всегда). Конечно, могут быть заранее заданные комбинации клавиш (типа CTRL + ALT +DEL во многих ОС), когда они перехватываются в данном случае "рабочем столом", а еще лучше вообще не передаются в графическую подсистему. В любом случае, виджеты на них не должны реагировать.

В общем у меня пока плохо укладывается идея управления окнами. Как их создавать, удалять, обновлять и т.п.

Вот, например, мой виджет FButton, в конструкторе принимает следующее
CODE
FButton( FPoint, uint32_t width, uint32_t height, void* callbackFunc );


Пояснения, думаю, не требуются. Правильно ли, идеологически, в данном случае задавать реакцию при нажатию на кнопку таким образом (через указатель) на функцию? Вроде бы да. Ведь кнопка может быть нажата через тачскрин, выбрана кнопками "стрелками", или энкодером. И каждый раз проверять откуда пришло сообщение о нажатии на кнопку не совсем оптимально. Проще отработать некую функцию просто по нажатию на кнопку. Даже если на нее не нажимали, а установили ей ствойство pressed в true.

В общем как-то так, пока смутно...

И, нужно ли обнавлять виджеты, если они "прикрыты" в данный момент активным окном? Проще ведь отрисовывать виджет только под фокусом, и то, что ему принадлежит (т.е. дерево виджетов, начиная с родителя )?

Покопал коды Microchip Library, других библиотек. Но немного сложновато разобраться в их механизме...(


Спасибо!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 4 2012, 04:28
Сообщение #54


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (haker_fox @ Oct 3 2012, 12:58) *
У меня вырисовывается следующая концепция.
...

Примерно так и делается. У меня тоже есть групповые объекты. Например, меню и прочие экранные списки содержат объект:
CODE

template<typename T> class group
{
public:
group(uint_fast8_t N)
: CurrIndex(0)
, Count(0)
, MaxCount(N)
{
Items = new T[N];

for(uint_fast16_t i = 0; i < N; ++i)
{
Items[i] = 0;
}
}

void draw();
void next();
void prev();

uint_fast16_t curr_index() const { return CurrIndex; }
uint_fast16_t count() const { return Count; }

void init(const uint_fast16_t index = 0) { CurrIndex = index; Items[index]->set_selected(true); }
void append(T item) { if(Count < MaxCount) Items[Count++] = item; else print("error: cannot append item to the group - the group is full\r\n"); }
void remove() { if(Count) { Items[Count-1] = 0; --Count; } else print("warning: cannot remove item - the group is empty\r\n"); }
void remove_all() { for(uint_fast8_t i = 0; i < Count; ++i) Items[i] = 0; Count = 0; }

T & operator[](uint_fast16_t index) { return Items[index]; }
T & curr_item() { return Items[CurrIndex]; }

private:
uint_fast16_t CurrIndex;
uint_fast16_t Count;
const uint_fast16_t MaxCount;

T *Items;
};

который содержит, как правило, указатели на виджеты, обрабатываемые в контексте их виджета-контейнера (меню, например).

Виджет окна тоже имеет подобный вашему массив указателей (только у меня он называется иначе sm.gif). В общем, эти детали реализации уже не являются ключевыми - тут по делается по здравому смыслу в контексте задачи и возможностей.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 4 2012, 04:55
Сообщение #55


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Хочу сказать, что тот, кто писал под ТурбоВижн, в любое время дня и ночи скажет, что без группового виджета а-ля TGroup, который только является владельцем нескольких отображаемых элементов и маршрутизирует события, - никак не обойтись. И это не штампы. Просто правильная сразу концепция.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 4 2012, 14:28
Сообщение #56


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (dxp @ Oct 4 2012, 13:28) *
Примерно так и делается. У меня тоже есть групповые объекты. Например, меню и прочие экранные списки содержат объект:

который содержит, как правило, указатели на виджеты, обрабатываемые в контексте их виджета-контейнера (меню, например).

Виджет окна тоже имеет подобный вашему массив указателей (только у меня он называется иначе sm.gif). В общем, эти детали реализации уже не являются ключевыми - тут по делается по здравому смыслу в контексте задачи и возможностей.

Ну вот и замечательно, значит мой рассудок еще не сильно пострадал от поставленной задачи) Я, честно говоря, думал, что эта задача полегче будет. Но не совсем так, когда не используешь готовые библиотеки)


QUOTE (_Pasha @ Oct 4 2012, 13:55) *
Хочу сказать, что тот, кто писал под ТурбоВижн, в любое время дня и ночи скажет, что без группового виджета а-ля TGroup, который только является владельцем нескольких отображаемых элементов и маршрутизирует события, - никак не обойтись. И это не штампы. Просто правильная сразу концепция.

Да-да!!! В QT, насколько я помню, так тоже сделано (я с ней работал некоторое время). Там есть различные слои, на которых можно разместить и выровнять соответствующим образом, виджеты)

Спасибо!!!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:56
Рейтинг@Mail.ru


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