|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.10.2018, 07:43 | #11 |
Участник клуба
Регистрация: 17.05.2011
Сообщений: 1,660
|
Не пробовали разобрать готовое решение, которое реально работает? Вроде как у линуксоидов в свободном доступе информация о работе системы и её различных графических оболочек, например GTK. Наверняка там есть люди, которые знают, как это устроено, да и исходники можно ковырять.
|
29.10.2018, 15:22 | #12 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
29.10.2018, 16:28 | #13 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Я просто ждал LV1974, когда он придёт, возмутится и напишет что надо 27-127 классов. Не помню сколько у него.
А так то тема большая, во если бы ТС схему деления приложил, тогда бы можно было предметно рассуждать. А то так не понятно, то ли графическая библиотека заимствованная: к примеру AGG либо же вновь разрабатываемая. Да и с геометрическими расчётами аналогично. Сколько и каких классов оставить или убрать? Я же простые решения предлагаю. А если кто хочет сложные, то он может открыть в брауезе страницу с флагами. Там много всяких настроек для графической системы: таких как рендеринг в параллельном потоке и опережающий рендеринг.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
29.10.2018, 23:09 | #14 |
Форумчанин
Регистрация: 17.10.2018
Сообщений: 184
|
Achtung, minen!!!
По делу: начинаете с реализации функции рисования всех примитивов в буфер. Да да, свои собственные, с самого нуля, хорошо оптимизированные иначе будет безбожно тормозить, потянете? Если нет тогда добро пожаловать в текстовый режим. Макс размер буфера 80х25х2=4КБ памяти на весь экран. Достаточно реализовать DrawChar(x,y,char,attribute) и DrawBuffer(x,y,&buf). Это самые низкоуровневые функции рисования, ничто больше не должно рисовать "физически". Далее 2 основных элемента - компонент и его наследник контейнер. Компонент имеет функции IsExposed:boolean {если элемент виден на экране - true else false}; Draw() отрисовывает компонент и содержит реальные вызовы DrawChar. Дополнительно DrawComponent - обычно его надо вызывать для прорисовки, содержит if IsExposed then Draw. Идея ясна - отрисовываем только когда компонент виден на экране. Теперь к DrawChar: Контейнер имеет буфер рисования. Вызываются все Draw'ы элементов на этом контейнере. Каждый компонент "думает" 1)если "я" компонент, то вызываю owner'овский DrawChar; 2) если "я" контейнер, то вызываю свой DrawChar на свой же buffer, затем по окончании делаю Owner.DrawBuffer. Таким хитрым способом отрисовываются все компоненты, например на активном окне, не перерисовывая окн[о/а] рядом или позади. Причем идёт это по иерархии наверх к рабочему столу или элементу screen, который является наследником контейнера, но в инициализации не выделял буфер, а сделал указатель на b800:0000; Из чего состоит окно: Window наследуется из контейнера; имеет Header или Border: элемент рисует границы (обрамление, заголовок, кнопки) ClientArea: то самое место где будут находится все элементы. Полосы прокрутки: соединены с ClientArea, если захочется нарисовать элемент за пределами окна, ClientArea расширяется и полосы прокрутки становятся активными. где хранить данные: Как в ООП: Всё хранится в собственном объекте, включая список или указатель на объекты внутри "меня". |
29.10.2018, 23:14 | #15 |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 774
|
tae1980, предлагаю такое решение:
hierarchy<int, UIElement*> — Хранилище всего UI. У каждого UIElement есть id, которое соответствует ключу, по которому он хранится в иерархии, плюс id родителя. Опционально — id дочерних элементов. У наследников UIElement есть всё остальное: отрисовка, события Сделайте генерацию иерархии классов по разметке, например,html, xml или json (последнего нет, вот Вам хороший вариант).
a.k.a. Angelicos Phosphoros
Мой сайт |
30.10.2018, 10:56 | #16 | |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Попробую договориться с автором.
С уважением, Алексей.
|
|
30.10.2018, 12:20 | #17 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
и явно не достаточно одного типа. интерфейс IWidget существует именно потому, что предполагается наличие различных наследников (конкретные виджеты). в том, что касается ТС - он сам не понимает, что ему нужно. и пытается рассуждать о сабже в отрыве от конкретных технологий (например - в отрыве от ЯП). это - путь в никуда, я думаю. ему сейчас не о классах думать нужно. а о том, что такое вообще из себя должна представлять "библиотека графического интерфейса". я поясню этот момент поподробнее. GUI - такая предметная область, которая естественным образом эксплуатирует ОО-парадигму. не важно, если будет реализована на языке, который ООП из коробки не поддерживает. (например, GTK написана на pure c, однако ж архитектура все равно получилась оопнутой) один из фундаментальных принципов ООП: "разделяй и властвуй". считается, что первым человеком в истории человечества, кто официально провозгласил этот принцип - Гай Юлий Цезарь. поэтому, именно он считается первым в истории оо-программистом. теперь ближе к делу. существует оконная система. отвечает за работу с окном операционной системы. существует графическая система. отвечает за вывод графики в окошке. поэтому, зависит от оконной системы. существует GUI система. отвечает за управление виджетами. которые отрисовывает руками графической системы. итого: уже 3 интерфейса. GUI-system ничего не знает ни об окнах, ни о графике. но она знает об интерфейсах этих систем. а значит может рисовать свои виджеты их руками. нам не важно, как рисуется графика: там под капотом будет openGL, или DirectX, или ещё какая нибудь высокоуровневая графическая система. нам не важно, как графическая система взаимодействует с оконной. все что нужно GUI-системе для существования: уметь получать критичные сигналы (общий старт, или немедленная остановка всей работы, etc), и уметь манипулировать интерфейсом графической системы, дабы отрисовывать свои виджеты. в данной теме уже присутствовали такие предложения, как: "нарисуй прямоугольник для начала". я считаю, что такие предложения - лютый фейл некомпетентных людей. потому что "рисование" - компетенция графической системы, а вовсе не GUI. грамотно оформленная gui система не прибита гвоздями к контексту рисования. примеры грамотной архитектуры можно подсмотреть в таких движках, как например CEGUI. примечание: CEGUI на мой взгляд - ужассная неудобная библиотека для игрового GUI. но архитектура там правильная. позволяет менять как оконную подсистему, так и графическую. но вот сам дизайн работы именно с GUI - лично я плевался. поэтому, не рекомендую рассматривать CEGUI как эталон собственно GUI системы. архитектура - великолепная. но дизайн самой системы не особо юзабельный. |
|
30.10.2018, 12:23 | #18 | |||
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Цитата:
Цитата:
ОЗУ 1Мб, прямая адресация нижних 64кб, при этом есть ОДНО! окно проецирования страниц по 16кб. Дополнительно, в нижние 64кб можно вывести страницы экрана. Экран 512х240, один цвет (бумага, чернила) на линию в 8 точек из 16 цветов. Текстового экрана нет. Ни каких видео карт, экран это 2 страницы памяти (32 кб) выше 64 кб. Процессор Z80, частота 3.5Мгц, турбо 14Мгц. Из языков доступны: Турбо паскаль 3.0, Си (разные версии), ассемблер. Конечная версия будет писаться на асме, проверка теории на Паскале (как более близко мне языке, чем Си). Из выше сказанного, есть один очень противный вывод, привязка к размеру страницы в 16кб и большой геммор с передачей информации между страницами. QT и OpenGL дело хорошее, но я даже Turbo Vision'ом не могу воспользоваться на прямую, так как ему нежно 670Мб, что здесь не позволительная роскошь. По этому я и испрашивал про теорию, а не примеры. Из имеющегося: драйвера экрана с минимальным набором функций, функции бдос для работы с экраном. Всё это работает с экраном на прямую. Исходники различных библиотек по рисованию примитивов и вывода спрайтов, тоже работающие напрямую с экраном. Всё нужное для графического интерфейса пишем с нуля. От сюда деление задачи на две части: 1) Организации хранения и обработки информации об окнах и т.п. 2) вывод всего это добра на экран (то что ты назвал графической библиотекой). Обычно начинают с простого: создания и очистки окна, закрытие окна и восстановления фона по ним. Уже здесь должны быть проработаны основные принципы работы по обеим задачам. Вы пишите всё правильно, но для того случая, когда у вас есть хоть что-то. Сейчас есть готовые решения (граф.интерфейсы) при прямой работе с экраном, что мне нравиться. Хочу работать через буфера. Что означает, что текущие драйвера и функции бдос идут лесом, так они ни чего не знают о буферах. А исходники готовых библиотек рисования нужно так же отучать от работы с экраном. В конченом, итоге будет принято решения об изменении процедур в бдос и драйверов под задачи интерфейса (такая возможность есть, ведь ОС по сути пишем сами). Но пока рассчитываем только на себя. От сюда же моё стремление к низкоуровневому описанию структуры хранения информации, желательно по байтному. Так как ни каких классов в асме нет.
С уважением, Алексей.
|
|||
30.10.2018, 12:33 | #19 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Спасибо, за наводку.
С уважением, Алексей.
|
30.10.2018, 13:18 | #20 | ||||||
Форумчанин
Регистрация: 02.02.2009
Сообщений: 842
|
Цитата:
Тут прошу пояснить. Куда рисует символ в буфер ли на экран. Это вывод знакоместа из буфера на экран? Цитата:
Давайте определимся с термином: Что такое буфер? Это буфер экран, окна, контейнера, элемента? Что значит "компонент виден на экране"? Он должен быть полностью на экране или частично? Цитата:
Как понял цепочку. Цикл по элементам верхнего контейнера (можно экрана), в котором для каждого элемента проверяется видимость, если не видим то пропускаем, если видим то отрисовываем, если элемент сам контейнер - то рекурсивный запуск функции. Цитата:
Нечто подобное предлагал выше, из особенностей: * Графика храниться только на уровне элементов. * Если объект хотя бы частично на экране, то он прорисовывается полностью: для элементов графически в свой буфер, логически в свой буфер и границы в буфер контейнера; для контейнеров - только логика в свой буфер, границы в буфер внешнего контейнера. Тут дополнительный расход памяти и времени проца, так как если элемент на экране только частично, в своем буфере он всё равно прорисывается полностью. Но иногда без этого нельзя будет определить физические размеры и внешний вид элемента. Иного выхода пока не вижу. * При выводе строиться логический и графические образы экрана из элементов попавших на него. Логический используется так же для отработки действий мышки. Графический кидается на экран или сразу строиться на нем. Цитата:
Цитата:
Именно по этому планируется только логическая буферизация контейнеров, с полной перестройкой при изменении размеров любого внутреннего элемента. Так коечная реализация будет на асме, это проблематично. Но можно следовать "духу".
С уважением, Алексей.
Последний раз редактировалось tae1980; 30.10.2018 в 13:35. |
||||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание графического интерфейса 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 |