Стандартная библиотека UI компонент. CAppDialog. CPanel на нём. метод CPanel.Bottom() который set не отрабатывает?

 

Всем привет!

  Я набросал простенький код демонстрирующий проблему. Создаётся диалог, на нём панелька. И в делегируемых обработчиках OnTimer и OnTick панелька прирастает вниз (как мне кажется).

  И я бы ожидал, что по тикам И по таймеру, мой CPanel объект должен расти вниз. В output'е по крайней мере цифры растут, а объект на экране нет. 

QL 0 11:31:04.448 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=496

RI 0 11:31:05.359 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTick Bottom=497

QP 0 11:31:05.449 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=498

QF 0 11:31:06.014 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTick Bottom=499

KS 0 11:31:06.446 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=500

EM 0 11:31:07.440 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=501

KH 0 11:31:07.609 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTick Bottom=502

GP 0 11:31:08.454 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=503

IE 0 11:31:09.384 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTick Bottom=504

LD 0 11:31:09.445 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=505

OM 0 11:31:10.447 ea (EURUSD,H1) CProblemShowDlg::UpdateDataTimer Bottom=506

CE 3 11:31:11.161 ea (EURUSD,H1) ExpertRemove() function called

  Конечно удивляют числа около 500, хотя я создаю y2 = 50

  Но, возможно, Bottom возвращает относительно left.top чарта или какого-то другого чорта    Но, ок, я бы тогда ожидал, что раз возвратный метод возвращает значение относительно некой точки, то и выставляющий принять бы тоже должен был относительно той же точки (поэтому строка 

m_panel.Bottom( m_panel.Bottom() + 1);

вполне логична)


 Может кто знает что я делаю не так? Может нужен принудительный Redraw() какой-то?

Файлы:
dlg.mqh  8 kb
ea.mq5  3 kb
 
В стандартном ГУИ сюрпризов больше, чем функциональности. Бегите от него, пока не встряли.
 

Спасибо, за совет, ибо проблема по прежнему актуальна. И что делать - я не знаю.

Единственное, что надумал - это действительно переходить на другую GUI библиотеку. Порыскав по сообществу остановился на библиотеке Анатолия Кажарского (respect товарищу):
https://www.mql5.com/ru/articles/3527

Если вдруг кто-нибудь сможет посоветовать нубу что-нибудь более адекватное - буду признателен.

Графические интерфейсы XI: Интеграция графической стандартной библиотеки (build 16)
Графические интерфейсы XI: Интеграция графической стандартной библиотеки (build 16)
  • www.mql5.com
Более подробно о том, для чего предназначена эта библиотека, можно прочитать в самой первой статье: Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1). В конце статей каждой части представлен список глав со ссылками, там же есть возможность загрузить к себе на компьютер полную версию библиотеки на текущей стадии разработки...
 
Я пользуюсь библиотекой Кажарского. Еще есть чуть более простая — Федоссеева:
Пользовательские графические элементы управления. Часть 1. Создание простого элемента управления
Пользовательские графические элементы управления. Часть 1. Создание простого элемента управления
  • www.mql5.com
Язык MQL5 обеспечивает разработчика большим набором программно управляемых графических объектов: кнопка, текстовая метка, поле ввода, графическая метка (рис. 1), различные графические аналитические инструменты (рис. 2). Всего в терминале MetaTrader 5 насчитывается более сорока графических объектов. Все эти объекты могут использоваться по...
 
Спасибо! Поизучаю - может простой библиотеки хватит.
 

На всякий случай, чтобы поставить точку в треде (вопрос был - теперь есть ответ) - вот как можно переместить или поменять размер объектов стандартной либы граф. объектов.

Повторюсь, что функции .Left(), .Top(), .Right(), .Bottom() которые выставляют соответствующие значения объекты на чарте не перемещают и его размеры не изменяют  (хотя внутренние переменные, например m_rect изменяют). Зачем тогда они - загадка (setter stub?).

Адекватно (ожидаемо) работают только возвращающие текущее значение.

int x1 = OBJ.Left();  int x2 = OBJ.Right();

int y1 = OBJ.Top();  int x2 = OBJ.Bottom();


Перемещение объекта

//изменяем координаты

x1 = x1 +...

y1 = y1 +...

OBJ.Move( x1, y1);


Изменение размера

int w = OBJ.Width();  int h = OBJ.Height();

//Изменение размера

w = w + ...

h = h + ...

OBJ.Size( w, h);

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