Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2018, 22:07   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Разработка библиотеки графического интерфейса

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

В общем, в настоящий момент идет сбор исходной информации, без учета языка реализации.

Может кто поделиться книгами, опытом, возможно своими наработками?
Поиск по инету не дал ни какого результата, только использование существующих библиотек.

PS я знаю о существовании большого числа готовых решений. Мне интересно реализовать своё.
Определенный навыки и понимание как это работает есть, хочу увидеть альтернативные решения для выбора наиболее оптимального.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 28.10.2018, 11:21   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
интересно реализовать своё
- значит, есть свои идеи, своё видение предмета - чем плохи существующие и как их можно улучшить. А "я хочу хоть плохонькое, но своё, но понятия не имею как. Дяденьки, помогите!" - несерьезно это. Да и своё ли оно тогда уже будет ?
digitalis вне форума Ответить с цитированием
Старый 28.10.2018, 11:47   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

tae1980
Цитата:
Сообщение от tae1980 Посмотреть сообщение
библиотеки графического интерфейса
Такого понятия не существует. Есть UI, GUI, GL.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.10.2018, 12:38   #4
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Поиск по инету не дал никакого результата...
я знаю о существовании большого числа готовых решений.
Вообще не понятно, одно другое исключает.

Начинать с графики будет сложновато, см. текстовый, он же консольный, режим. Если надо азы, придётся копаться в старье, например библиотека ncurses. Либо классика жанра Borland TurboVision, существующий в С и Паскаль вариантах и отличной помощью в одноимённой ИДЭ. Всё доступно с исходными кодами.

Вообще сначала попробуйте порисовать просто окошечки, создать некий апи для вывода на экран символов, перемещения курсора в окне, плюс перемещение окна. След шаг - буферизация окна, добавление нескольких окон. И далее систему сообщений или событий. HandleEvent(Event), GetEvent, PutEvent. Event - содержит нажатые клавиши, позицию мыши и её кнопки, тип сообщения ну и т.д. Это долгое и увлекательное занятие изучения UI обеспечит Вас удовольствием на всю зиму.
jillitil вне форума Ответить с цитированием
Старый 28.10.2018, 17:35   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
- значит, есть свои идеи, своё видение предмета - чем плохи существующие и как их можно улучшить. А "я хочу хоть плохонькое, но своё, но понятия не имею как. Дяденьки, помогите!" - несерьезно это. Да и своё ли оно тогда уже будет ?
Умный, да? Тогда прошли мне готовый GUI для CP/M на z80 (спектрум, Профи) точнее для ОС PQ-Dos. Эту ОС разработал Вадим Чертков в 2016 году.
На сколько знаю я, существует только одна реализации библиотека оконного интерфейса win12. Но она жутко кривая.

Ну почему всегда находятся "знатоки" который считают себя умнее всех? Я же не зря писал PS.

Личных идей у меня нет, есть крайне не большой опыт написания подобного, читал теорию. Но всё что знаю меня не очень устраивает, ищу новый пути реализации.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Такого понятия не существует. Есть UI, GUI, GL.
Существуют. Или существовали в прошлом. Про реализацию "UI, GUI, GL" ни чего дельного найти не смог, только как использовать. А это я и так знаю. Так что написал тау умышленно, что бы казать что мне нужны "корешки, а не вершки".
Цитата:
Сообщение от jillitil Посмотреть сообщение
Вообще не понятно, одно другое исключает.
Начинать с графики будет сложновато, см. текстовый, он же консольный, режим. Если надо азы, придётся копаться в старье, например библиотека ncurses. Либо классика жанра Borland TurboVision, существующий в С и Паскаль вариантах и отличной помощью в одноимённой ИДЭ. Всё доступно с исходными кодами.
Писал подобные библиотеки на паскале в году так 2003. Но сейчас хочу более глобальное замутить.
Уже выкачала исходники TurboVision. Изучаю.

Цитата:
Сообщение от jillitil Посмотреть сообщение
Вообще сначала попробуйте порисовать просто окошечки, создать некий апи для вывода на экран символов, перемещения курсора в окне, плюс перемещение окна. След шаг - буферизация окна, добавление нескольких окон. И далее систему сообщений или событий. HandleEvent(Event), GetEvent, PutEvent. Event - содержит нажатые клавиши, позицию мыши и её кнопки, тип сообщения ну и т.д. Это долгое и увлекательное занятие изучения UI обеспечит Вас удовольствием на всю зиму.
Это все понятно и правильно. Интересует как хранить информацию об окнах и элементах.
Например: можно хранить в окнах логическую информацию о контейнерах, в контейнерах хранить логическую информацию об элементах, в элементах хранить логическую информацию о самих элементах и графическую информацию. При отрисовке проходим по всей цепочке и составляем логический образ экрана (его же используем для обработки событий). После чего собираем экран как пазл из частей элементов. При такой схеме не понятно где должна храниться информация о графическом оформлении окон (рамки и т.п.). И схема кажется слишком сложной.

В любом случае спасибо за ответ по существу. Ты первый из последних 50 человек.
С уважением, Алексей.

Последний раз редактировалось tae1980; 28.10.2018 в 18:12.
tae1980 вне форума Ответить с цитированием
Старый 28.10.2018, 19:00   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
В любом случае спасибо за ответ по существу. Ты первый из последних 50 человек.
Просто Вы недоговариваете по этому к вам такое и отношение.

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Существуют. Или существовали в прошлом. Про реализацию "UI, GUI, GL" ни чего дельного найти не смог, только как использовать.
Если бы вы сказали, что проектируете тогда вам проще было ответить.
А так по факту вы смешали в одном вопросе 3 задачи. Это значит, что вы не знаете ничего.

Проектирование бывает снизу в верх, а бывает с верху вниз. Сверху это когда вы свою задачу разбиваете на составляющие те на под задачи. А под задачи разбиваете ещё на под задачи и так пока не дойдёте до известных вам блоков.

Графическая система как раз и состоит из UI, GUI, GL.

Из литературы советую:
Буч Г., Максимчук Р., и др.(Booch)-Объектно-ориентированный анализ и проектирование с примерами приложений-Вильямс (2008)
(Классика программирования) Вирт Н., Гуткнехт Ю.-Разработка операционной системы и компилятора. Проект Оберон-ДМК Пресс (2012)
(Библиотека программиста) Фаронов В.В.-Искусство создания компонентов Delphi-Питер (2005)

Правда в вашем случае я бы вам посоветовал начать с низов. Потренируйтесь и сделайте простые вещи.
Векторный графический редактор, текстовый редактор, UI для игры: меню. Ползунки настройка звука, Выпадающий список выбора разрешения.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.10.2018, 19:35   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Это все понятно и правильно. Интересует как хранить информацию об окнах и элементах.
Например: можно хранить в окнах логическую информацию о контейнерах, в контейнерах хранить логическую информацию об элементах, в элементах хранить логическую информацию о самих элементах и графическую информацию. При отрисовке проходим по всей цепочке и составляем логический образ экрана (его же используем для обработки событий). После чего собираем экран как пазл из частей элементов. При такой схеме не понятно где должна храниться информация о графическом оформлении окон (рамки и т.п.). И схема кажется слишком сложной.
Судя по этому тексту вы не владеяте ООП, так что его стоит изучить.
Достаточно одного объекта типа IWidget с методом Draw. В нём и реализуется рисование. Для окна вам потребуется обычный рект с 4 параметрами.

Каждое окно хранит свой компоненты в виде объекта. Достаточно легко реализуется при помощи шаблонов. Просто создаёте список List:TList<IWidget>. И далее в методе Draw формы вызываете по очерёдно вызываете для них вывод List[i].Draw.
И ещё у IWidget завести общий объект style который хранит настройки стиля для отрисовки компонента: шрифт, тип линии, лип заливки, тип канта тип скругления.

Ещё удобно использовать слои для организации виджетов по горизнтали и вертикали в ряды и стоки и матрицы - такое сделано в QT поэтому советую посмотреть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.10.2018, 19:53   #8
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Просто Вы недоговариваете по этому к вам такое и отношение.
Если бы вы сказали, что проектируете тогда вам проще было ответить.
А так по факту вы смешали в одном вопросе 3 задачи. Это значит, что вы не знаете ничего.
Не хочу спорить на пустом месте. Замечу только, что вопрос просторен так умышленно, что бы исключить любый упоминания о языке программирования, о машине на которой всё это будет реализована. Во первых это реально не имеет отношение к задаче, так мне интересна теория, а она везде одинаковая. В вторых я уже пытался всё рассказывать "честно". Знаешь чего я наслушался? А зачем тебе это надо? Возьми "нормальную" машину! Возьми готовое решение. и т.п. И разговор о том что это хобби, ни к чему не приводит.
Так что тут каждое слово много раз выстрадано.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Из литературы советую:
Буч Г., Максимчук Р., и др.(Booch)-Объектно-ориентированный анализ и проектирование с примерами приложений-Вильямс (2008)
(Классика программирования) Вирт Н., Гуткнехт Ю.-Разработка операционной системы и компилятора. Проект Оберон-ДМК Пресс (2012)
(Библиотека программиста) Фаронов В.В.-Искусство создания компонентов Delphi-Питер (2005)
Спасибо. Буду курить.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Правда в вашем случае я бы вам посоветовал начать с низов. Потренируйтесь и сделайте простые вещи.
Векторный графический редактор, текстовый редактор, UI для игры: меню. Ползунки настройка звука, Выпадающий список выбора разрешения.
Не сочти за наглость, но часть из этого это очень просто и много раз делалось, а часть (редакторы и т.п.) на оборот выходят за рамки текущей задачи. Это будет писаться, но на основе принятых сейчас решений.

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

Цитата:
Сообщение от Pavia Посмотреть сообщение
И далее в методе Draw формы вызываете по очерёдно вызываете для них вывод List[i].Draw.
Можно, но очень долго. Тут придется выводить все окна целиком, независимо от их видимости на экране.
Так же это не показывает как решить проблему перекрывания окон, выхода окна за границу экрана, а так же что делать если содержимое окна больше его физического размера. Куда будет рисовать метод .Draw сразу в экран или каждое окно отрисовывается свой в свой буфер, а потом они выводятся на экран?
Метод описаны мною, позволяет разрешить большинство противоречий, при этом не хранить больших буферов, только логические. А то что буфера бьются на более мелкие (экран->окно->контейнер->форма) позволяет не прорисовывать лишнюю информацию при выводе.
Минусом является сложность структуры, и то что на одно место на экране может быть неограниченное количество буферов (например при перекрытии нескольких окон, место перекрытия будет храниться в буфере каждого окна), но так как они логические, это уменьшит расход памяти. То же самое графическими буферами у форм. Но тут спасением может быть решение, хранить такие буфера только у форм у которых на экране есть хотя бы один пиксель. Это же позволит ускорить вывод в формы которых нет на экране, так как вывод будет только логическим. Но это решение не позволит быстро пролистывать окна, так как нужно будет строит графические буфера для тех форм которые будут появляться на экране.

Вот я и ищу оптимальное решение.
С уважением, Алексей.

Последний раз редактировалось tae1980; 28.10.2018 в 20:23.
tae1980 вне форума Ответить с цитированием
Старый 28.10.2018, 21:41   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

tae1980

Цитата:
Сообщение от tae1980 Посмотреть сообщение
выхода окна за границу экрана, а так же что делать если содержимое окна больше его физического размера.
Это не вопрос GUI, это вопрос графической библиотеке. И там это решается отсечением.

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Так же это не показывает как решить проблему перекрывания окон
Окна выводятся в порядке в которым они лежат в списке тогда при перекрытие оно отобразятся правильно.

Что касается оптимизации добавьте флаг не прозрачности и блендинга и флаг поверхности. Если окно не прозрачное то оно попадает в тарфорет для отсечения.


Цитата:
Сообщение от tae1980 Посмотреть сообщение
Но тут спасением может быть решение, хранить такие буфера только у форм у которых на экране есть хотя бы один пиксель.
Не надо решать за других. Есть разработчик формы пусть он решает как ему удобнее. Ведь одним формам нужна прокрутка, другим она вовсе не нужна.
А вот он уже может сам создать свой буфер вернее поверхность для рисования, либо использовать существующую - родительскую.

Если вы рисуете на OpenGL то там быстрее всё перерисовать. А если через прямой доступ к первичной поверхности видео памяти, то там быстрее скопировать участок.

А по поводу сложности структуру. Я уже говорил начните снизу вверх. Сделайте как можно проще потом дорабатывайте и развивайте. А чтобы всё по 10 раз не переписывать заложите в основу абстрактные, вернее обобщённые классы. И интерфейсы проектируете так что-бы они были изолированны. Мне в этом плане понравилась архитектура QT. Хотя конечно там полно недочётов.

Есть формы которым нужен скролинг и есть которым не нужен. Значит абстрактый клсас должен содержать методы обоих форм. А вот при реализации вы если захотите сделаете 2 и более классов. Один который не оптимален и просто вызывает метод Draw, второй если окно непрозрачное вызывает копирование с экрана на экран. А затем оставшуюся часть как логический буфер передаёт в графическую библиотеку. В цикле проходит по дочерним компонентам и отсекает их. InresectRectInRect. И далее для оставшихся вызывает метод Draw они отисовываются. Отрисовываются они не целиком, а только то что "видно", обрезается по логическому буферу (ROI). Напоминаю что это уже делает графическая библиотека.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 28.10.2018 в 22:05.
Pavia вне форума Ответить с цитированием
Старый 28.10.2018, 22:06   #10
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Умный, да? Тогда прошли мне готовый GUI для CP/M на z80 (спектрум, Профи) точнее для ОС PQ-Dos
Вот тема человека который до сих пор неплохо разрабатывает оболочку для MS DOS, может эта тема будет вам интересна. http://www.programmersforum.ru/showthread.php?t=310336

Последний раз редактировалось Aliens_wolfs; 28.10.2018 в 22:12.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание графического интерфейса drag'n'drop genaveng WPF, UWP, WinRT, XAML 5 06.07.2013 21:58
Инструменты изменения графического интерфейса контролов Smogg Win Api 6 24.12.2012 07:42
Какую библиотеку графического интерфейса выбрать? demigod82 Visual C++ 3 22.04.2012 12:24
Тормоза при отработке графического интерфейса sergey113 Помощь студентам 10 23.03.2011 12:51
Написание графического интерфейса zhuravlov Фриланс 3 04.01.2011 21:54