Обсуждение статьи "Изучаем класс CCanvas. Реализация прозрачности графических объектов" - страница 4

 
Artyom Trishkin:
MQL4 ;)

Я не приветствую MQL4. Все примеры только на MQL5.

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
CCanvas     m_canvas;           // the canvas object
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime arr_time[];
   double   arr_open[];
   double   arr_close[];
   if(CopyTime(Symbol(),Period(),0,2,arr_time)==-1)
      return;
   if(CopyClose(Symbol(),Period(),0,2,arr_close)==-1)
      return;
   if(CopyOpen(Symbol(),Period(),0,2,arr_open)==-1)
      return;
   int x1,y1,x2,y2;
   if(!ChartTimePriceToXY(0,0,arr_time[0],arr_open[0],x1,y1))
      Print("Error ",GetLastError());
   if(!ChartTimePriceToXY(0,0,arr_time[1],arr_close[0],x2,y2))
      Print("Error ",GetLastError());
//x1 = Time[1];
//y1 = Open[1];
//x2 = Time[0];
//y2 = Close[1];
   Print("arr_time[0]=",arr_time[0],", arr_open[0]=",arr_open[0]);
   m_canvas.CreateBitmapLabel("COLOR_FORMAT_ARGB_NORMALIZE",x1,y1,MathAbs(x2-x1),MathAbs(y2-y1),COLOR_FORMAT_ARGB_NORMALIZE);
   m_canvas.Erase(ColorToARGB(clrBlue,200));
   m_canvas.Update();
   Sleep(10000);
   m_canvas.Destroy();
  }
//+------------------------------------------------------------------+
//| Gets the width of chart (in pixels)                              |
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- prepare the variable to get the property value
   long result=-1;
//--- reset the error value
   ResetLastError();
//--- receive the property value
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- display the error message in Experts journal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- return the value of the chart property
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Gets the height of chart (in pixels)                             |
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- prepare the variable to get the property value
   long result=-1;
//--- reset the error value
   ResetLastError();
//--- receive the property value
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- display the error message in Experts journal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- return the value of the chart property
   return((int)result);
  }
//+------------------------------------------------------------------+

 

И результат работы скрипта:

результат 

 

Владимир, вопрос к Вам как к спецу.

Есть панель в виде холста. А потом на графике рисуются трендовые линии. Как их спрятать за холст?

Скриншоты торговой платформы MetaTrader

RTS Splice, H1, 2016.10.16

АО &#39;&#39;Открытие Брокер&#39;&#39;, MetaTrader 5, Demo

RTS Splice, H1, 2016.10.16, АО &#39;&#39;Открытие Брокер&#39;&#39;, MetaTrader 5, Demo


 
Dennis Kirichenko:

Владимир, вопрос к Вам как к спецу.

Есть панель в виде холста. А потом на графике рисуются трендовые линии. Как их спрятать за холст?


Например уничтожить панель и нарисовать заново...
 
Ага, спасибо. Пока придумал просто объекты помещать на задний план...
[Удален]  
Vladimir Karputov:
Спасибо за статью. К сожалению, все ссылки на документацию в ней битые.
 
Alexey Kozitsyn:
Спасибо за статью. К сожалению, все ссылки на документацию в ней битые.

Спасибо за сообщение - справка перестроилась, поэтому ошибки. Ссылки поправим.

 
Vladimir Karputov:

By means of the class CCanvas? 

 

P.S. Use CCanvas.CreateBitmap:

Creates a graphical resource bound to a chart object.

1. Creates a graphical resource in the main window of the current chart.

bool  CreateBitmap( 
   const string       name,                                 // name 
   const datetime     time,                                 // time 
   const double       price,                                // price 
   const int          width,                                // width 
   const int          height,                               // height 
   ENUM_COLOR_FORMAT  clrfmt=COLOR_FORMAT_XRGB_NOALPHA      // format 
   );

 

Thus you will be able to bind one corner of a Сanvas. But width and height, all the same, will be set in pixels. 


а можно по русски писать здесь?

А то вы одним указания даете, а на самом деле двойные стандарты исповедуете.

 
Alexey Kozitsyn:
Спасибо за статью. К сожалению, все ссылки на документацию в ней битые.
Ссылки поправили. Спасибо за сообщение.
 
Alexey Petrov:
Ссылки поправили. Спасибо за сообщение.

Ошибки остались.

Пункт "Введение":

...

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

...


Пункт "5.1. Создание скрипта "Illusion.mq5""

...

Рисуем закрашенный круг. Круг будет рисоваться поверх цвета, которым мы заполнили канвас (canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));).

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

Заполняем весь канвас цветом в формате ARGB c прозрачностью alpha

Выводим текст - тип обработки изображения для данного канваса. Цвет текста в формате ARGB и альфа-каналом равным 255, то есть цвет выводимого текста 

Если мы хотим, чтобы все нарисованное отобразилось на экране, нужно обновить экран.

Так как мы создавали графический ресурс с привязкой к объекту чарта (метод CreateBitmapLabel), то удаление ресурса выполним с помощью метода Destroy() - заодно 

...

 

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

Вроде вынесена на передний план, все рисуется за ней, а вот сделки накладываются сверху.

void CreateEdit(long             chart_id,         // id графика
                int              sub_window,       // номер окна (подокна)
                string           name,             // имя объекта
                color            font_color,       // цвет шрифта
                int              x_size,           // ширина
                int              y_size,           // высота
                int              x_distance,       // координата по оси X
                int              y_distance,       // координата по оси Y
                long             z_order,          // приоритет
                color            background_color) // цвет фона        
  {
// Если объект создался успешно, то...
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ...установим его свойства
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // установка угла графика
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // цвет шрифта
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // цвет фона
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // ширина
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // высота
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // установка координаты X
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // установка координаты Y
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         // нельзя выделить объект, если FALSE
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // приоритет объекта
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // только для чтения
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // выравнивание по левому краю
      //--- отобразим на переднем (false) или заднем (true) плане 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // нет всплывающей подсказки, если "\n"
     }
  }