Как поставить объекты на передний план в MQL5

 

Не могу поставить, кнопки, поля ввода и окна, сделанные на основе CCanvas, на передний план, чтобы остальные графические объекты чарта не перекрывали их. В MQL4 я использовал следующий код и всё работало.

long tf = ObjectGetInteger(m_chart_id, m_objname, OBJPROP_TIMEFRAMES);
if(ObjectSetInteger(m_chart_id, m_objname, OBJPROP_TIMEFRAMES, -1))
  ObjectSetInteger(m_chart_id, m_objname, OBJPROP_TIMEFRAMES, tf);

Но в MQL5 этот код, очевидно, работать не хочет. В чем причина такого поведения объектов?

 

Кто последний создан - тот и сверху.

Рисуйте канву последней и она будет сверху всех предыдущих объектов.

 
Vladimir Karputov:

Кто последний создан - тот и сверху.

Рисуйте канву последней и она будет сверху всех предыдущих объектов.

А как же быть с кнопками и полями ввода? Что бы они были на переднем плане их придётся каждый раз удалять и создавать заново?
 

Мне тоже интересно этот вопрос.

Если мы создаем объект например ObjectCreate(0,"ххх",OBJ_BUTTON,0,0,0), то при режиме OBJPROP_BACK,false, то кнопка над графиком, но всё равно остается под объектами терминала, такие как Sell, Buy и соединительная линия.

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

Вот я специально уменьшил окно чарта, чтобы хорошо было видно что происходит.  Думаю это надо исправить.


 

 
Mihail Matkovskij:
А как же быть с кнопками и полями ввода? Что бы они были на переднем плане их придётся каждый раз удалять и создавать заново?

Посмотрите реализацию панелей диалогов на базе CDialog.

При минимизации и разворачивании формы объекты не удаляются. Самый быстрый способ убедится в этом: пример из справки CBmpButton, а к самом классе CBmpButton в конструкторе и деструкторе разместить принт:

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CBmpButton::CBmpButton(void) : m_border(0),
                               m_bmp_off_name(NULL),
                               m_bmp_on_name(NULL),
                               m_bmp_passive_name(NULL),
                               m_bmp_active_name(NULL)
  {
   Print(__FUNCTION__);
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CBmpButton::~CBmpButton(void)
  {
   Print(__FUNCTION__);
  }

Сверните, разверните форму и проверьте уничтожаются ли объекты-кнопки?

 

Считаю, нужно ввести дополнительную функцию для этой цели:  ObjectBringToTop(…).   Потому что делать через OBJPROP_TIMEFRAMES - это во-первых, костыльно, а во вторых - довольно спорно и неоднозначно. Данная функция управляет видимостью объекта, но с какой стати меняется его z-порядок?

В качестве аналогии можно взять реализацию работы окон в Windows.  Видимость окна определяется свойством WS_VISIBLE, но это не влияет на z-расположение.  Окно просто видимо или невидимо, но находится на прежнем месте.  А для поднятия окна наверх предназначена функция BringWindowToTop.

Соответственно должна быть предусмотрена и возможность узнать текущий z-порядок объекта.

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