Grafik in MetaTrader 5: Canvas - Zeichnen innerhalb des Puffers mit der Objektbindung

 

Im Build 619 ergab sich die neue Funktion ResourceCreate zur spontanen Erstellung dynamischer Grafikressourcen.

Damit kann man jetzt beliebige komplexe Bilder in der 32-Bit-Farbe inklusive des Alpha-Kanals erzeugen und diese an Objekte in der Grafik binden.

Wie können Entwickler davon profitieren:

  • Programme können schöne Interfaces spontan erstellen, ohne dass sie jede Menge Dateien mit sich tragen müssen

  • zusätzliche Ressourcendateien (nicht nur BMP oder WAV) kann man direkt in den EX5-Dateien mit Hilfe der Direktive #resource "Dateiname" hinzufügen, diese zur Laufzeit ablesen, modifizieren und über Objekte legen

    im nächsten Build wird die Funktion ResourceLoad() verfügbar sein, welche es ermöglicht, die zuvor an der EX5-Datei angefügten Ressourcen abzulesen

  • unter der Transparenz-Kontrolle mit Hilfe der Alpha-Kanäle kann man beliebige analytische Konstruktionen über die Grafik legen

    man kann, zum Beispiel, eine halbdurchsichtige Wolke mit der Vorausschätzung der Markttendenzen zeichnen und dabei Farbe und Sättigung verwalten

  • alles beliebige auf dem Chart zeichnen


Bald fügen wir der Standardbibliothek die Klasse CCanvas hinzu, mit welcher Sie ganz leicht Ihre Bilder handhaben können: Einfach zeichnen Sie sie in Ihrem Puffer und dann geben Sie sie an das gebundene Objekt aus.

Hier ist ein einfaches Beispiel von einem die Funktionen dieser Klasse zeigenden Script (Dateien sind im Anhang):

#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();
     }
//---
  }