Предложение по поводу отрисовки графических объектов.

 

Рассмотрим вывод графического объекта прямоугольник. Всех остальных объектов это также касается.

Если выводится объект на переднем плане, то существует возможность выводить его в виде рамки. Или можно залить объект цветом.

Но иногда есть необходимость объект поместить на "задний" план. Чтобы при его прорисовке/перерисовке объект не выводился поверх других графических построений.

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

Исправьте, пожалуйста. Мне кажется, это ошибочное построение.

 
Eugeni Neumoin:

Рассмотрим вывод графического объекта прямоугольник. Всех остальных объектов это также касается.

Если выводится объект на переднем плане, то существует возможность выводить его в виде рамки. Или можно залить объект цветом.

Но иногда есть необходимость объект поместить на "задний" план. Чтобы при его прорисовке/перерисовке объект не выводился поверх других графических построений.

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

Исправьте, пожалуйста. Мне кажется, это ошибочное построение.

ObjectCreate(chart_ID, name, OBJ_RECTANGLE_LABEL, 0, 0, 0);
//---
ObjectSetInteger(chart_ID, name, OBJPROP_BACK, true);
ObjectSetInteger(chart_ID, name, OBJPROP_BGCOLOR, ChartGetInteger(chart_ID, CHART_COLOR_BACKGROUND));
 
Aleksandr Slavskii #:

Спасибо. Попробую.

Почему выше написал?

Есть в документации примеры работы с прямоугольниками и другими объектами. ЗДесь я функцию переименовал для собственных нужд и добавил пару параметров в верхних двух строчках. В документации другое название функции.

 bool LevelsCreate(const long               chart_ID=0,        // ID графика 
                        bool                  typeLevel=false,   // импульсный или разворотный уровень
                        int                   number=0,          // номер уровня 
                        const string          name="Rectangle",  // имя уровня 
                        const int             sub_window=0,      // номер подокна 
                        datetime              time1=0,           // время первой точки 
                        double                price1=0,          // цена первой точки 
                        datetime              time2=0,           // время второй точки 
                        double                price2=0,          // цена второй точки 
                        const color           clr=clrRed,        // цвет уровня 
                        const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий уровня 
                        const int             width=1,           // толщина линий уровня 
                        const bool            fill=false,        // заливка прямоугольника цветом 
                        const bool            back=false,        // на заднем плане 
                        const bool            selection=true,    // выделить для перемещений 
                        const bool            hidden=true,       // скрыт в списке объектов 
                        const long            z_order=0)         // приоритет на нажатие мышью 
{
..............
      //--- включим (true) или отключим (false) режим заливки уровня 
      ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
      //--- отобразим на переднем (false) или заднем (true) плане 
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
.............

}

Казалось бы, достаточно заливки 

OBJPROP_FILL

Когда  

OBJPROP_BACK

=false, отсутствие заливки дает вывод рамки. А когда задаем = true - вывод объекта на заднем плане, то заливка не влияет. В любом случае на заднем плане прямоугольник будет залит цветом.

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

Попробую еще поменять местами эти две функции. Это просто для эксперимента.

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

Я знаю, что в языке MQL зарыто много таких нюансов. Что-то было исправлено при переходе на пятерку. Но все равно встречаются баги. Их надо исправлять.

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

Например, в случае исправления багов. 

 
Aleksandr Slavskii #:

Ваше предложение для 

OBJ_RECTANGLE_LABEL

А у меня  

OBJ_RECTANGLE

Это разные объекты.

 

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

 

Но при переводе на задний план получилось такое:


Поэтому оставил на переднем плане. Это не критично, но не эстетично.


 
Eugeni Neumoin #:

Ваше предложение для 

OBJ_RECTANGLE_LABEL

А у меня  

OBJ_RECTANGLE

Это разные объекты.

OBJ_RECTANGLE  вообще не нашёл даже намёка на ту проблему, что вы описываете.

 
Aleksandr Slavskii #:

OBJ_RECTANGLE  вообще не нашёл даже намёка на ту проблему, что вы описываете.

Намека не нашли, а программа выводит. На картинках вверху.

 
Eugeni Neumoin #:

Намека не нашли, а программа выводит. На картинках вверху.

У меня нет заливки прямоугольников, при переводе прямоугольника на задний план.

 

Выводить панельку на передний план можно так

ObjectSetInteger(0, name, OBJPROP_TIMEFRAMES, OBJ_NO_PERIODS)
ObjectSetInteger(0, name, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS)
 

Вот задал вывод в виде рамки на заднем плане (то есть без заливки):

А это задал заливку прямоугольника опять же на заднем плане:


 
Aleksandr Slavskii #:

Выводить панельку на передний план можно так

Поэкспериментируйте с примером из документации https://www.mql5.com/ru/docs/constants/objectconstants/enum_object/obj_rectangle

У меня на основе этого примера код в программе.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE
  • www.mql5.com
Прямоугольник. Примечание Для прямоугольника можно установить режим заливки при помощи свойства OBJPROP_FILL . Пример Следующий скрипт создает и...
Причина обращения: