|
Embedded GUI, Что поизучать? |
|
|
|
Sep 7 2012, 06:45
|

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

|
Добрый день, коллеги!
Посоветуйте, пожалуйста, что можно почитать по принципу создания, проектирования GUI?
Возник соблазн написать что-то свое. На Си++.
Требования к интерфейсу: работа на ARM7+, где-то (с усечениями) на AVR8, разрешение от 128x64 до 1024x768, от монохрома до 8-8-8. Как-то так. Высокая сложность не требуется, хотя я расчитываю, что с Си++ сложность нарастить будет не сложно)))
Знаю, что есть готовые системы. Но хочу поупражнятся сам.
Спасибо!
--------------------
Выбор.
|
|
|
|
|
 |
Ответов
|
Oct 3 2012, 05:58
|

Познающий...
     
Группа: Свой
Сообщений: 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, других библиотек. Но немного сложновато разобраться в их механизме...( Спасибо!
--------------------
Выбор.
|
|
|
|
|
Oct 4 2012, 04:28
|

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; };
который содержит, как правило, указатели на виджеты, обрабатываемые в контексте их виджета-контейнера (меню, например). Виджет окна тоже имеет подобный вашему массив указателей (только у меня он называется иначе  ). В общем, эти детали реализации уже не являются ключевыми - тут по делается по здравому смыслу в контексте задачи и возможностей.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
haker_fox Embedded GUI Sep 7 2012, 06:45 Lotor Тоже для общего развития хотелось бы почитать каку... Sep 7 2012, 08:19 haker_fox QUOTE (Lotor @ Sep 7 2012, 17:19) PS: я в... Sep 7 2012, 10:49  Lotor Цитата(haker_fox @ Sep 7 2012, 14:49) Гот... Sep 7 2012, 11:14  dxp QUOTE (haker_fox @ Sep 7 2012, 17:49) Гот... Sep 8 2012, 04:29   Lotor Цитата(dxp @ Sep 8 2012, 08:29) P.S. Хоте... Sep 8 2012, 09:10   andrewlekar Цитата(dxp @ Sep 8 2012, 09:29) Разработа... Sep 10 2012, 04:55   haker_fox QUOTE (dxp @ Sep 8 2012, 13:29) Подобный ... Sep 10 2012, 14:23    dxp QUOTE (haker_fox @ Sep 10 2012, 21:23) По... Sep 10 2012, 15:43     mdmitry Цитата(dxp @ Sep 10 2012, 19:43) Если это... Sep 10 2012, 21:15      dxp QUOTE (mdmitry @ Sep 11 2012, 04:15) Весь... Sep 11 2012, 03:48       _pv Цитата(dxp @ Sep 11 2012, 10:48) По услов... Sep 11 2012, 07:37        dxp QUOTE (_pv @ Sep 11 2012, 14:37) возможно... Sep 11 2012, 08:40         mdmitry Цитата(dxp @ Sep 11 2012, 12:40) К тому ж... Sep 11 2012, 12:23          dxp QUOTE (mdmitry @ Sep 11 2012, 19:23) Уваж... Sep 11 2012, 15:31           AlexandrY Цитата(dxp @ Sep 11 2012, 18:31) Это как ... Sep 11 2012, 18:33           mdmitry Цитата(dxp @ Sep 11 2012, 19:31) Говорить... Sep 11 2012, 21:40            dxp QUOTE (mdmitry @ Sep 12 2012, 04:40) Пояс... Sep 12 2012, 01:20             AlexandrY Цитата(dxp @ Sep 12 2012, 04:20) Alexandr... Sep 12 2012, 06:33              dxp QUOTE (AlexandrY @ Sep 12 2012, 13:33) Ци... Sep 12 2012, 08:50               AlexandrY Цитата(dxp @ Sep 12 2012, 11:50) Да, дава... Sep 12 2012, 13:42                _Pasha Цитата(AlexandrY @ Sep 12 2012, 16:42) Ин... Sep 12 2012, 14:44                dxp QUOTE (AlexandrY @ Sep 12 2012, 20:42) Я ... Sep 12 2012, 15:20                 AlexandrY Цитата(dxp @ Sep 12 2012, 18:20) С чего э... Sep 12 2012, 19:58                  dxp QUOTE (AlexandrY @ Sep 13 2012, 02:58) Во... Sep 13 2012, 03:51                   mdmitry Цитата(dxp @ Sep 13 2012, 07:51) Не очень... Sep 13 2012, 07:43                    _pv Цитата(mdmitry @ Sep 13 2012, 13:43) Смен... Sep 13 2012, 09:06                     mdmitry Цитата(_pv @ Sep 13 2012, 13:06) посмотри... Sep 13 2012, 13:04                    dxp QUOTE (mdmitry @ Sep 13 2012, 14:43) Напр... Sep 13 2012, 14:00                     mdmitry Цитата(dxp @ Sep 13 2012, 18:00) Ага, вро... Sep 13 2012, 20:09                      dxp QUOTE (mdmitry @ Sep 14 2012, 03:09) Что-... Sep 14 2012, 06:14                       mdmitry Цитата(dxp @ Sep 14 2012, 10:14) Как-то н... Sep 14 2012, 07:55                        _Pasha Цитата(mdmitry @ Sep 14 2012, 10:55) P.S.... Sep 14 2012, 09:37                       kolobok0 Цитата(dxp @ Sep 14 2012, 10:14) ...А где... Sep 14 2012, 10:47                        dxp QUOTE (kolobok0 @ Sep 14 2012, 17:47) кон... Sep 14 2012, 12:31             mdmitry Цитата(dxp @ Sep 12 2012, 05:20) Ну, т.е.... Sep 12 2012, 13:59     haker_fox QUOTE (dxp @ Sep 10 2012, 23:43) Если это... Sep 11 2012, 01:54      AHTOXA Подумайте сразу о параметрах сообщения. Ну, типа к... Sep 11 2012, 02:51       haker_fox QUOTE (AHTOXA @ Sep 11 2012, 10:51) Подум... Sep 11 2012, 03:25   kolobok0 Цитата(dxp @ Sep 8 2012, 08:29) ...
Кодvo... Sep 13 2012, 20:39 kolobok0 Цитата(haker_fox @ Sep 7 2012, 10:45) ...... Sep 7 2012, 19:40 Lotor Цитата(kolobok0 @ Sep 7 2012, 23:40) Если... Sep 7 2012, 20:17 _Pasha FTK Sep 8 2012, 02:35 AlexandrY Цитата(haker_fox @ Sep 7 2012, 09:45) Пос... Sep 8 2012, 08:13 haker_fox В общем по-маленьку начал кропать свой ГУИ. Пока и... Sep 8 2012, 14:09 haker_fox dxp, спасибо большое за подробнейшее разъяснение... Sep 11 2012, 05:16 haker_fox Гм, не думал, что скромный вопрос разовъется в жар... Sep 12 2012, 23:12 haker_fox QUOTE (AlexandrY @ Sep 13 2012, 03:58) Во... Sep 13 2012, 04:10 AlexandrY Цитата(haker_fox @ Sep 13 2012, 07:10) Ув... Sep 13 2012, 06:54  dxp QUOTE (AlexandrY @ Sep 13 2012, 13:54) Ну... Sep 13 2012, 07:39 Lotor dxp, минимум в одной теме на форуме встречал уже В... Sep 13 2012, 05:18 dxp QUOTE (Lotor @ Sep 13 2012, 12:18) Не при... Sep 13 2012, 05:52  _Pasha Хочу сказать, что тот, кто писал под ТурбоВижн, в ... Oct 4 2012, 04:55 haker_fox QUOTE (dxp @ Oct 4 2012, 13:28) Примерно ... Oct 4 2012, 14:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|