Графика в MetaTrader 5: Canvas - рисование внутри буфера с привязкой к объектам

 

Оригинал: https://www.mql5.com/ru/forum/6405


В 619 билде появилась новая функция ResourceCreate для создания динамических графических ресурсов на лету.

С ее помощью теперь можно создавать любые сложные изображения в 32 битном цвете, включая альфа-канал и прикреплять их к объектам на графике.

Что это дает разработчикам:

  • программы могут на лету создавать красивые интерфейсы без необходимости таскать за собой массу файлов

  • дополнительные ресурсные файлы (не только BMP и WAV) можно добавлять прямо в EX5 файлах с помощью директивы #resource "имя файла", считывать их во время исполнения, модифицировать и накладывать на объекты

    в ближайшем билде будет доступна функции ResourceLoad(), которая позволит считывать ранее прикрепленные к EX5 файлу ресурсы

  • контролируя прозрачность с помощью альфа-каналов можно накладывать поверх графика любые аналитические построения

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

  • рисовать все что угодно на чарте


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

Вот простой пример скрипта с демонстрацией работы этого класса (файлы приложены):

#include "Canvas.mqh"
 //+------------------------------------------------------------------+
 //| Script program start function                                    |
 //+------------------------------------------------------------------+
 void OnStart()
   {
    CCanvas can;
 //---
    can.Create("MySpace",0,0,512,512,COLOR_FORMAT_ARGB_RAW);
    MathSrand(0);
 //---
    for(int i=0;i<10000;i++)
      {
       can.FillRect(MathRand()&255,MathRand()&255,256+(MathRand()&255),256+(MathRand()&255),XRGB(MathRand(),MathRand(),MathRand()));
       can.Circle(MathRand()&511,MathRand()&511,MathRand()&127,XRGB(MathRand(),MathRand(),MathRand()));
       can.Triangle(MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,XRGB(MathRand(),MathRand(),MathRand()));
       //---
       can.Update();
      }
 //---
   }
 




Файлы:
canvas.mqh  13 kb
 

Канвасы это хорошо!

Скоро и на МТ4 ....

 
Вопрос по 418 билду - как и где скачать (обновится) ?
 
Обновление на 418 пойдет у брокеров с субботы. Можно обновиться быстрее через demo.metaquotes.net:443
 
спасибо.
 
Был когда-то бенчмарк для мак ос, который рисовал квадраты, круги, треугольники и показывал скорость отрисовки. Очень похож на скрипт Рената.
 

Браво!

Долго ждал такой возможности - рисовать сложные кривули на лету!

Респект МетаКвотам!

Многие задачи упрощаются или вообще становятся возможными.

 
Не силен в ООП. Я правильно понимаю, что этот ресурс будет единым объектом, а не кучей независимых объектов-точек, как при аналогичном рисовании лейблами в МТ4, когда потом приходится обслуживать десятки тысяч объектов (скажем, при рисовании графиков)?
 
Думаю - да. Иначе нет смысла
 
Да, один графический обьект, где можно рисовать хоть собственный чарт. Посмотрите на код - он маленький и прозрачный.
 
Mathemat:
Не силен в ООП. Я правильно понимаю, что этот ресурс будет единым объектом, а не кучей независимых объектов-точек, как при аналогичном рисовании лейблами в МТ4, когда потом приходится обслуживать десятки тысяч объектов (скажем, при рисовании графиков)?

понаблюдай за таким скриптом, а затем вынеси can.Update(); из цикла:

#include <Canvas.mqh>

void OnStart(){
   CCanvas can;
   can.Create("MySpace",0,0,800,800,COLOR_FORMAT_ARGB_RAW);
   can.FillRect(0,0,800,800,XRGB(255,255,255));
   for(int x=0;x<800;x++){
      can.SetPixel(x,MathSin(3.1415*0.005*x)*100+200,0);
      can.Update();
     }
  }
//+------------------------------------------------------------------+
по сабжу: великолепная новость! еще не гуглил, а насколько сложно выводить/прикрутить на канвас текст(шрифты)?
Причина обращения: