|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.10.2018, 22:07 | #1 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Разработка библиотеки графического интерфейса
Интересна разработка своего велосипеда в виде библиотеки графического интерфейса.
Интересует теория вопроса. Как организовать хранение информации об окнах, формах и элемента? Как настроить взаимосвязи? Как организовать вывод на экран с учетом наложения элементов? Как реализовать события? В общем, в настоящий момент идет сбор исходной информации, без учета языка реализации. Может кто поделиться книгами, опытом, возможно своими наработками? Поиск по инету не дал ни какого результата, только использование существующих библиотек. PS я знаю о существовании большого числа готовых решений. Мне интересно реализовать своё. Определенный навыки и понимание как это работает есть, хочу увидеть альтернативные решения для выбора наиболее оптимального.
С уважением, Алексей.
|
28.10.2018, 11:21 | #2 | |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Цитата:
|
|
28.10.2018, 11:47 | #3 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
tae1980
Такого понятия не существует. Есть UI, GUI, GL.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
28.10.2018, 12:38 | #4 | |
Форумчанин
Регистрация: 17.10.2018
Сообщений: 184
|
Цитата:
Начинать с графики будет сложновато, см. текстовый, он же консольный, режим. Если надо азы, придётся копаться в старье, например библиотека ncurses. Либо классика жанра Borland TurboVision, существующий в С и Паскаль вариантах и отличной помощью в одноимённой ИДЭ. Всё доступно с исходными кодами. Вообще сначала попробуйте порисовать просто окошечки, создать некий апи для вывода на экран символов, перемещения курсора в окне, плюс перемещение окна. След шаг - буферизация окна, добавление нескольких окон. И далее систему сообщений или событий. HandleEvent(Event), GetEvent, PutEvent. Event - содержит нажатые клавиши, позицию мыши и её кнопки, тип сообщения ну и т.д. Это долгое и увлекательное занятие изучения UI обеспечит Вас удовольствием на всю зиму. |
|
28.10.2018, 17:35 | #5 | |||
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
На сколько знаю я, существует только одна реализации библиотека оконного интерфейса win12. Но она жутко кривая. Ну почему всегда находятся "знатоки" который считают себя умнее всех? Я же не зря писал PS. Личных идей у меня нет, есть крайне не большой опыт написания подобного, читал теорию. Но всё что знаю меня не очень устраивает, ищу новый пути реализации. Существуют. Или существовали в прошлом. Про реализацию "UI, GUI, GL" ни чего дельного найти не смог, только как использовать. А это я и так знаю. Так что написал тау умышленно, что бы казать что мне нужны "корешки, а не вершки". Цитата:
Уже выкачала исходники TurboVision. Изучаю. Цитата:
Например: можно хранить в окнах логическую информацию о контейнерах, в контейнерах хранить логическую информацию об элементах, в элементах хранить логическую информацию о самих элементах и графическую информацию. При отрисовке проходим по всей цепочке и составляем логический образ экрана (его же используем для обработки событий). После чего собираем экран как пазл из частей элементов. При такой схеме не понятно где должна храниться информация о графическом оформлении окон (рамки и т.п.). И схема кажется слишком сложной. В любом случае спасибо за ответ по существу. Ты первый из последних 50 человек.
С уважением, Алексей.
Последний раз редактировалось tae1980; 28.10.2018 в 18:12. |
|||
28.10.2018, 19:00 | #6 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
Цитата:
А так по факту вы смешали в одном вопросе 3 задачи. Это значит, что вы не знаете ничего. Проектирование бывает снизу в верх, а бывает с верху вниз. Сверху это когда вы свою задачу разбиваете на составляющие те на под задачи. А под задачи разбиваете ещё на под задачи и так пока не дойдёте до известных вам блоков. Графическая система как раз и состоит из UI, GUI, GL. Из литературы советую: Буч Г., Максимчук Р., и др.(Booch)-Объектно-ориентированный анализ и проектирование с примерами приложений-Вильямс (2008) (Классика программирования) Вирт Н., Гуткнехт Ю.-Разработка операционной системы и компилятора. Проект Оберон-ДМК Пресс (2012) (Библиотека программиста) Фаронов В.В.-Искусство создания компонентов Delphi-Питер (2005) Правда в вашем случае я бы вам посоветовал начать с низов. Потренируйтесь и сделайте простые вещи. Векторный графический редактор, текстовый редактор, UI для игры: меню. Ползунки настройка звука, Выпадающий список выбора разрешения.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
28.10.2018, 19:35 | #7 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
Достаточно одного объекта типа IWidget с методом Draw. В нём и реализуется рисование. Для окна вам потребуется обычный рект с 4 параметрами. Каждое окно хранит свой компоненты в виде объекта. Достаточно легко реализуется при помощи шаблонов. Просто создаёте список List:TList<IWidget>. И далее в методе Draw формы вызываете по очерёдно вызываете для них вывод List[i].Draw. И ещё у IWidget завести общий объект style который хранит настройки стиля для отрисовки компонента: шрифт, тип линии, лип заливки, тип канта тип скругления. Ещё удобно использовать слои для организации виджетов по горизнтали и вертикали в ряды и стоки и матрицы - такое сделано в QT поэтому советую посмотреть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
28.10.2018, 19:53 | #8 | ||||
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Так что тут каждое слово много раз выстрадано. Цитата:
Цитата:
Сейчас есть библиотека которая позволяет открыть окна, создавать простейшие кнопки, выводить текстовую информацию. Но она это делает напрямую на экран. А когда открываются окна, информация под ними копируется в буфер, для восстановления после закрытия окна. Такая схема мне не нравиться и ищу ей замену. Ползунки и т.п. реализовать не сложно, проблема в том как их эффективно вывести на экран. Сейчас наиболее выгодным кажется решение когда графическая информация храниться только на уровне самих форм (кнопок и т.п.), а на экран выводиться посредством построения логического буфера. Это позволит избавиться от буфера подложки, и минимизировать обновления на экране (обновляет только то что изменилось). С другой стороны не понятно что делать с графическим оформлением окон. Пока видится выходом признать рамку окна системой контейнеров, в которых размещать объекты описывающие части рамки. Цитата:
Так же это не показывает как решить проблему перекрывания окон, выхода окна за границу экрана, а так же что делать если содержимое окна больше его физического размера. Куда будет рисовать метод .Draw сразу в экран или каждое окно отрисовывается свой в свой буфер, а потом они выводятся на экран? Метод описаны мною, позволяет разрешить большинство противоречий, при этом не хранить больших буферов, только логические. А то что буфера бьются на более мелкие (экран->окно->контейнер->форма) позволяет не прорисовывать лишнюю информацию при выводе. Минусом является сложность структуры, и то что на одно место на экране может быть неограниченное количество буферов (например при перекрытии нескольких окон, место перекрытия будет храниться в буфере каждого окна), но так как они логические, это уменьшит расход памяти. То же самое графическими буферами у форм. Но тут спасением может быть решение, хранить такие буфера только у форм у которых на экране есть хотя бы один пиксель. Это же позволит ускорить вывод в формы которых нет на экране, так как вывод будет только логическим. Но это решение не позволит быстро пролистывать окна, так как нужно будет строит графические буфера для тех форм которые будут появляться на экране. Вот я и ищу оптимальное решение.
С уважением, Алексей.
Последний раз редактировалось tae1980; 28.10.2018 в 20:23. |
||||
28.10.2018, 21:41 | #9 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
tae1980
Цитата:
Окна выводятся в порядке в которым они лежат в списке тогда при перекрытие оно отобразятся правильно. Что касается оптимизации добавьте флаг не прозрачности и блендинга и флаг поверхности. Если окно не прозрачное то оно попадает в тарфорет для отсечения. Цитата:
А вот он уже может сам создать свой буфер вернее поверхность для рисования, либо использовать существующую - родительскую. Если вы рисуете на OpenGL то там быстрее всё перерисовать. А если через прямой доступ к первичной поверхности видео памяти, то там быстрее скопировать участок. А по поводу сложности структуру. Я уже говорил начните снизу вверх. Сделайте как можно проще потом дорабатывайте и развивайте. А чтобы всё по 10 раз не переписывать заложите в основу абстрактные, вернее обобщённые классы. И интерфейсы проектируете так что-бы они были изолированны. Мне в этом плане понравилась архитектура QT. Хотя конечно там полно недочётов. Есть формы которым нужен скролинг и есть которым не нужен. Значит абстрактый клсас должен содержать методы обоих форм. А вот при реализации вы если захотите сделаете 2 и более классов. Один который не оптимален и просто вызывает метод Draw, второй если окно непрозрачное вызывает копирование с экрана на экран. А затем оставшуюся часть как логический буфер передаёт в графическую библиотеку. В цикле проходит по дочерним компонентам и отсекает их. InresectRectInRect. И далее для оставшихся вызывает метод Draw они отисовываются. Отрисовываются они не целиком, а только то что "видно", обрезается по логическому буферу (ROI). Напоминаю что это уже делает графическая библиотека.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 28.10.2018 в 22:05. |
||
28.10.2018, 22:06 | #10 | |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Цитата:
Последний раз редактировалось Aliens_wolfs; 28.10.2018 в 22:12. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание графического интерфейса 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 |