а такое возможно? - страница 8

 
Vitaly Muzichenko #:

Где-то на форуме полный рабочий код на mql4 и mql5

Писал примерно год назад.

В какой теме, или как искать?

 
Andrey Sokolov #:

В какой теме, или как искать?

Вот тут большой вопрос с примитивным поиском по сайту, иначе Я бы и сам нашёл.

 
Наверное, вот это?
 
Vasiliy Pushkaryov #:
Наверное, вот это?

спасиб

 
Andrey Sokolov #:

спасиб

Там в самом последнем посте этой ветки версия с правками и исходник
 
Andrey Sokolov #:

Здравствуйте, покажите, пожалста, как делали?

Выводишь данные из массива в Лейблы в клиентской области Скролл бара со смещением равным смещению этого Скролл бара. В качестве Скролл бара можно взять CScrollV из стандартной библиотеки. Массив - список со всеми пунктами (items). Лейблы - область для вывода items из списка. Что там такого сверх сложного?... При желании справится любой программист, который дружит с ООП.

 
Mihail Matkovskij #:

Выводишь данные из массива в Лейблы в клиентской области Скролл бара со смещением равным смещению этого Скролл бара. В качестве Скролл бара можно взять CScrollV из стандартной библиотеки. Массив - список со всеми пунктами (items). Лейблы - область для вывода items из списка. Что там такого сверх сложного?... При желании справится любой программист, который дружит с ООП.

Со скролом из СБ разбирались? У меня почему-то не получилось отдельно на графике заставить работать, без клиентской панели. Может сможете помочь?

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

Обсуждение статьи "Как создать графическую панель любой сложности и как это работает"

Vasiliy Pushkaryov, 2021.12.21 10:12

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

Например, с чекбоксом такой код дает реакцию на клик мыши. Галочка появляется и исчезает.

#include <Controls\CheckBox.mqh>
CCheckBox Chbox;
//+------------------------------------------------------------------+
void OnInit()
{
  Chbox.Create(0, "MyCheckBox", 0, 20, 20, 100, 40);
  ChartRedraw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Chbox.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+


А с вертикальным скролом - никакой реакции на нажатия кнопок мыши.

#include <Controls\Scrolls.mqh>
CScrollV Scroll;

void OnInit()
{
  Scroll.Create(0, "MyScrollV", 0, 20, 20, 40, 200);
  ChartRedraw();
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Scroll.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+

Подскажите, пожалуйста, кто знает, как заставить работать этот комбинированный элемент на графике?


 
Vasiliy Pushkaryov #:

Со скролом из СБ разбирались? У меня почему-то не получилось отдельно на графике заставить работать, без клиентской панели. Может сможете помочь?


Там много нюансов. На Чекбоксе галка работает (визуально) поскольку это OBJ_BITMAP_LABEL, а смена его State осуществляется терминалом. Его клик можно отследить как и клик любого Битмап лейбла в OnChartEvent. Но в стандартной библиотеке своя событийная модель основанная на пользовательских событиях. Они генерируются в void CAppDialog::ChartEvent с помощью перебора CArrayObj  CWndContainer::m_controls если компонент CScrollV был добавлен в CAppDialog. Тогда генерируется такие события как ON_CLICK, ON_DRAG_START, ON_DRAG_PROCESS и ON_DRAG_END.  В вашем же случае компоненты не были добавлены в  CAppDialog, поэтому события не генерируются. Как обойти данный механизм и заставить генерироваться пользовательские события без CAppDialog об этом я не думал. Нужно более подробно анализировать исходники.

Можно попробовать создать компонент на основе класса CWndContainer. И добавить элементы в него. Там нет визуальных элементов (как в окнах CDialog и CAppDialog), но все нужные механизмы для правильной работы элементов UI присутствуют.
 
Mihail Matkovskij #:

Там много нюансов. На Чекбоксе галка работает (визуально) поскольку это OBJ_BITMAP_LABEL, а смена его State осуществляется терминалом. Его клик можно отследить как и клик любого Битмап лейбла в OnChartEvent. Но в стандартной библиотеке своя событийная модель основанная на пользовательских событиях. Они генерируются в void CAppDialog::ChartEvent с помощью перебора CArrayObj  CWndContainer::m_controls если компонент CScrollV был добавлен в CAppDialog. Тогда генерируется такие события как ON_CLICK, ON_DRAG_START, ON_DRAG_PROCESS и ON_DRAG_END.  В вашем же случае компоненты не были добавлены в  CAppDialog, поэтому события не генерируются. Как обойти данный механизм и заставить генерироваться пользовательские события без CAppDialog об этом я не думал. Нужно более подробно анализировать исходники.

Можно попробовать создать компонент на основе класса CWndContainer. И добавить элементы в него. Там нет визуальных элементов (как в окнах CDialog и CAppDialog), но все нужные механизмы для правильной работы элементов UI присутствуют.
Спасибо, за описание механизмов работы CAppDialog и за предложение скомпоновать в контейнер. Будет чуть больше времени, попробую поэкспериментировать.
Причина обращения: