Создание графической библиотеки с нуля

 
сабж
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Краудсорсовый GUI. Открытое бета-тестирование.

Алексей Барбашин, 2020.03.07 21:25

"но может проще сделать все в объектах" - это более чем логично

"Да конечно частично будем опираться." - тогда сразу исправляемся:

class CCoordPBase

Наследуемся от CObject, то есть:

class CCoordPBase : public CObject

Хотя наверное можно и по другому:

class Control : public CObject

CObject - это базовый класс всех объектов в библиотеке разработчиков. Сделано по аналогии с С++ и C#. В шарпе базовым объектом (типом) является Object

Координаты и размеры - это уже свойства элемента (контрола), так же как и цвет основы, цвет и толщина рамки, радиусы скруглений, пиктограмма и текст.

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

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

Чтобы далеко не искать вот образец примера простейшего универсального контролла:

Содержит background, border, radius, icon, text

Если нужно получить Label, тогда не указывается фон, бордюр и иконка, если нужен Panel, тогда не указывается содержимое, если нужна кнопка-картинка, тогда указывается только icon, если нужна кнопка с картинкой, тогда указывается фон, рамка и картинка..

То есть такой состав является довольно универсальным для большинства элементов управления.


с этим понятно, вопрос по смене стиля по наведению при этом сохраняя координаты... хотя вроде уже понятно

Есть ли стандартная билиотека по контролу ??

 

Суть CObject  - типизировать все объекты.

К примеру нам нужна библиотека списка (список элементов, комбобокс, чекслист и так далее). Для каждого типа элементов мы можем создавать свой тип массива, так Анатолий и поступил, а можно воспользоваться уже готовым инструментом: CArrayObj

То есть очень многие куски кода не нужно изобретать, они уже еть, бери и используй.

 
Alexandr Andreev:

с этим понятно, вопрос по смене стиля по наведению при этом сохраняя координаты... хотя вроде уже понятно

Есть ли стандартная билиотека по контролу ??

За саму основу можно взять стандартную библиотеку от разработчиков, не вижу в этом ничего постыдного, их иерархию.

Конечно оттуда нужно выбросить все, что связано с непосредственным построением, но оставить систему передачи событий - она действительно универсальна!

По этой технологии не зависимо от того к какому класу будет принадлежать даже самый сложный элемент управления события будут передаваться через типизированную систему элементарного объекта.

Прорисовка основного контрола будет выполнятся в базовом CControls, после чего будет генериться событие OnPaint(). Это позволит дорисовывать/перерисовывать потомков и вообще даст самому пользователю возможность перерисовать контрол как он захочет.

 
Alexandr Andreev:

Давай!!!!! 

а я думал запилить сразу элементарное взаимодействие

куда будем вносить позиционирвания типо слева от прошлого объекта в случае выстраивания в строчку или в столбик

вообщем пишем универсальный контрол

Именно так и нужно построить: запилить элементарное взаимодействие.

Базовый контрол на самом начальном уровне не обязан иметь все нужные свойства, хватит одного только background.

Ведь для отрисовки самого контрола в нем будет находится соответствующая функция. Поэтому при добавлении каких-либо свойств дорабатывать придется только одну единственную функцию.

По иерархии элементов?

CObject - базовый типовой

class CControl : public CObject - базовый контрол самой библиотеки

class CContainerControl : public CControl - групповой контрол. Одним из его полей будет массив вложенных контролов. Пример ты можешь посмотреть в стандартной библиотеке CWndContainer.

 
Саша, раз ты начал уже кодить тогда сделай открытый проект на MQL, можно будет вести совместную разработку и к ней смогут подключиться желающие. Как знать, возможно такие найдутся.
 
Алексей Барбашин:
Саша, раз ты начал уже кодить тогда сделай открытый проект на MQL, можно будет вести совместную разработку и к ней смогут подключиться желающие. Как знать, возможно такие найдутся.

пока приостановился... смотрю стандартные библиотеки.... там много чего лишнего

хотя не много))) но котрол правильнее будет свой написать... ну либо сразу наследовать 

CChartObject

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Алексей Барбашин:
Саша, раз ты начал уже кодить тогда сделай открытый проект на MQL, можно будет вести совместную разработку и к ней смогут подключиться желающие. Как знать, возможно такие найдутся.

думаю с чистого листа рановато, сперва чего-то накидать надо

 
Alexandr Andreev:

пока приостановился... смотрю стандартные библиотеки.... там много чего лишнего

хотя не много))) но котрол правильнее будет свой написать... ну либо сразу наследовать 

CChartObject

Не, не!!

Смотри внимательнее!

Этот контрол как раз путь в никуда! Нам не нужны дискретные объекты чарта! Нужно на канвасе рисовать - только это даст развитие и широкие возможности.

А то, что основной контрол нужно делать свой - это однозначно.

В стандартной библиотеке свойства и состояния разбиты между CWndObject и CWnd, а нам нужно все объединить в одном контроле.

 
Алексей Барбашин:

Не, не!!

Смотри внимательнее!

Этот контрол как раз путь в никуда! Нам не нужны дискретные объекты чарта! Нужно на канвасе рисовать - только это даст развитие и широкие возможности.

А то, что основной контрол нужно делать свой - это однозначно.

В стандартной библиотеке свойства и состояния разбиты между CWndObject и CWnd, а нам нужно все объединить в одном контроле.

Четверть часа пытался создать проект - а он был создан оказываться, теперь смотрю как сделать публичным

 
Alexandr Andreev:

думаю с чистого листа рановато, сперва чего-то накидать надо

Уверен что с чистого листа и не стоит.

Очень умные люди потратили много времени и знаний чтобы сделать ту же стандартную библиотеку или библиотеку Анатолия.

Люди потратили время и знания и было бы глупо это не использовать.

Нужно просто взять лучшее, с нашей точки зрения, и в той и в другой и собрать новое.

Нужно учиться на чужих ошибках. Свои мы и так создадим )))

Причина обращения: