Создание перемещаемой информационной панели

 

Привет, разработчики.
Есть созданная на MQL4 панель, в  которой есть поля ввода, кнопки и label, жестко привязанные через ENUM_BASE_CORNER к конкретно заданным координатам. Можно ли с помощью набора определенных конкретных действий, и если да, то как, сделать эту панель свободно перемещаемой по графику? Стандартную библиотеку Objects.mqh и премудрости ООП для непосредственно создания этой панели не использую, все объекты созданы через ObjectCreate.

 
Разве что с помощью описания события перемещения, но забава еще та
 

добавляем мышиное событие - опрашиваем клик левой кнопки - если нажата, проверяем координату - если нажата на панели (и кнопка зажата), то изменяем координаты панели, согласно перемещению мышки...

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

 
Galina Bobro:
Разве что с помощью описания события перемещения, но забава еще та
Это получается, выбираешь объект, захват которого учитывается для перемещения, а потом все координаты всех объектов изменяешь на то самое расстояние, на которое  произошло смещение мыши? Действительно веселое удовольствие... А как можно изначально спроектировать эту панель так, чтобы она была доступна для перемещения? Какие и как точки привязки выбирать?
 
Artyom Kuraev:
Это получается, выбираешь объект, захват которого учитывается для перемещения, а потом все координаты всех объектов изменяешь на то самое расстояние, на которое  произошло смещение мыши? Действительно веселое удовольствие... А как можно изначально спроектировать эту панель так, чтобы она была доступна для перемещения? Какие и как точки привязки выбирать?


Да ничего там суперсложного нет. Основой такой панели должен быть прямоугольник (залитый или прозрачный) типа OBJ_RECTANGLE_LABEL. Его выделение мышью - гасим все объекты на нем для удобства перемещения. Далее прямоугольник перемещается пользователем, куда угодно. Отмена выделения - объекты отображаются на прямоугольнике. Координаты всех объектов указываются относительно левого верхнего угла прямоугольника (есть объекты, у которых нельзя свободно выбрать угол привязки). 

Можно и без гашения обойтись, но это приводит к не совсем красивым эффектам - не всякий компьютер успевает корректно отобразить объекты на перемещаемой панели, в итоге они могут съезжать с нее по ходу движения.

 
Ihor Herasko:


Да ничего там суперсложного нет. Основой такой панели должен быть прямоугольник (залитый или прозрачный) типа OBJ_RECTANGLE_LABEL. Его выделение мышью - гасим все объекты на нем для удобства перемещения. Далее прямоугольник перемещается пользователем, куда угодно. Отмена выделения - объекты отображаются на прямоугольнике. Координаты всех объектов указываются относительно левого верхнего угла прямоугольника (есть объекты, у которых нельзя свободно выбрать угол привязки). 

Можно и без гашения обойтись, но это приводит к не совсем красивым эффектам - не всякий компьютер успевает корректно отобразить объекты на перемещаемой панели, в итоге они могут съезжать с нее по ходу движения.

Спасибо за развернутый ответ. Идею уловил, осталось понять, как реализовать.

Координаты относительно объекта (прямоугольника) можно задать программно? Или подразумевается, что координату каждого объекта мы получаем в результате расчета как координату левого угла прямоугольника плюс заданное смещение?

"Гасим все объекты" - это для всех цветовых параметров задаем clrNONE, а по окончанию перемещения восстанавливаем прежнюю расцветку?

 
Artyom Kuraev:

Спасибо за развернутый ответ. Идею уловил, осталось понять, как реализовать.

Координаты относительно объекта (прямоугольника) можно задать программно? Или подразумевается, что координату каждого объекта мы получаем в результате расчета как координату левого угла прямоугольника плюс заданное смещение?

Простым сложением. У прямоугольника есть свои (X; Y). У каждого объекта на панели задаем относительные (XN; YN). Для преобразования их в абсолютные координаты складываем: (X + XN; Y + YN).

"Гасим все объекты" - это для всех цветовых параметров задаем clrNONE, а по окончанию перемещения восстанавливаем прежнюю расцветку?

Обычно я это делаю простым удалением объектов. Для удобства создается две функции: ShowSummary() - отображает все объекты панели и HideSummary() - удаляет все объекты панели (кроме подложки, естественно).
 
в МТ4 объекты моментально перерисовываются - нет смысла "гасить объекты" и перемещать пустой прямоугольник
 
Artyom Kuraev:

Привет, разработчики.
Есть созданная на MQL4 панель, в  которой есть поля ввода, кнопки и label, жестко привязанные через ENUM_BASE_CORNER к конкретно заданным координатам. Можно ли с помощью набора определенных конкретных действий, и если да, то как, сделать эту панель свободно перемещаемой по графику? Стандартную библиотеку Objects.mqh и премудрости ООП для непосредственно создания этой панели не использую, все объекты созданы через ObjectCreate.

можно совсем-совсем побыстрому наваять - просто создать ещё одну метку, отслеживать её штатные перемещения и следом за ней перемещать все элементы "панели"

что-то потипу:

// псевдокод !!

int x=10,y=10; // чтобы метка была в каком-то разумном углу месте "панели"

int OnInit() {

  fgLabel=ObjectCreate(0,"fgLabel",0,0);  // метка для перемещений

  ObjectSetInteger(0,"fgLabel",OBJPROP_XDISTANCE,x);ObjectSetInteger(0,"fgLabel",OBJPROP_YDISTANCE,y);

  ObjectSetString(0,"fgLabel",OBJPROP_TEXT,"[ drag me :-) ]");

  ObjectSetInteger(0,fgLabel,OBJPROP_SELECTABLE,true); ObjectSetInteger(0,fgLabel,OBJPROP_SELECTED,true);

}

void OnChartEvent(...) {

   if ( (id==CHARTEVENT_OBJECT_DRAG || id==CHARTEVENT_OBJECT_CHANGE) && sparam=="fgLabel") {

       // метку перенесли

       x+=(dx=(ObjectGetInteger(0,"fgLabel",OBJPROP_XDISTANCE)-x)); // на столько перенесли по X

       y+=(dy=(ObjectGetInteger(0,"fgLabel",OBJPROP_YDISTANCE)-y)); // на столько перенесли по Y

       // и теперь всем объектам панели добавить dx и dy

       ObjectSetInteger(0,"object1",OBJPROP_XDISTANCE,ObjectGetInteger(0,"object1",OBJPROP_XDISTANCE)+dx);

       ...

       // на всяк.случай - восстановить свойство SELECTABLE у той метку за которую таскаем панель

   }

   if (id==CHARTEVENT_OBJECT_DELETE && sparam=="fgLabel") {

     //случайно удалил нашу метку

     // надо нарисовать её заново по коорд. x, y

   }

}

 
Taras Slobodyanik:
в МТ4 объекты моментально перерисовываются - нет смысла "гасить объекты" и перемещать пустой прямоугольник

Вы просто не имели дело с "медленными" компьютерами )))
 
Разобрался. Спасибо всем!