Diskussion zum Artikel "Die Betrachtung der CCanvas-Klasse. Wie man transparente Objekte zeichnet" - Seite 4

 
Artyom Trishkin:
MQL4 ;)

Ich begrüße MQL4 nicht. Alle Beispiele sind nur in 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;           // das Leinwandobjekt
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
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 = Zeit[1];
//y1 = Open[1];
//x2 = Zeit[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();
  }
//+------------------------------------------------------------------+
//| Ermittelt die Breite des Diagramms (in Pixel)|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- die Variable vorbereiten, um den Eigenschaftswert zu erhalten
   long result=-1;
//--- den Fehlerwert zurücksetzen
   ResetLastError();
//--- den Eigenschaftswert erhalten
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- Anzeige der Fehlermeldung im Expertenjournal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- Rückgabe des Wertes der Diagrammeigenschaft
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Ermittelt die Höhe des Diagramms (in Pixel).
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- die Variable vorbereiten, um den Eigenschaftswert zu erhalten
   long result=-1;
//--- den Fehlerwert zurücksetzen
   ResetLastError();
//--- den Eigenschaftswert erhalten
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- Anzeige der Fehlermeldung im Expertenjournal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- Rückgabe des Wertes der Diagrammeigenschaft
   return((int)result);
  }
//+------------------------------------------------------------------+

Und das Ergebnis des Skripts:

Ergebnis

 

Vladimir, eine Frage an Sie als Experten.

Es gibt ein Panel in Form einer Leinwand. Und dann werden Trendlinien auf das Diagramm gezeichnet. Wie kann man sie hinter der Leinwand verstecken?

Screenshots von der MetaTrader-Handelsplattform

RTS Splice, H1, 2016.10.16

JSC &#39;&#39;Otkritie Broker&#39;&#39;, MetaTrader 5, Demo

RTS Splice, H1, 2016.10.16, JSC ''Otkritie Broker'', MetaTrader 5, Demo


 
Dennis Kirichenko:

Vladimir, eine Frage an Sie als Experten.

Es gibt ein Panel in Form einer Leinwand. Und dann werden Trendlinien auf das Diagramm gezeichnet. Wie kann man sie hinter der Leinwand verstecken?


Zum Beispiel, indem man das Panel zerstört und sie neu zeichnet....
 
Ja, danke. Bis jetzt habe ich die Idee, einfach Objekte in den Hintergrund zu stellen....
[Gelöscht]  
Vladimir Karputov:
Vielen Dank für den Artikel. Leider sind alle Links zur Dokumentation darin defekt.
 
Alexey Kozitsyn:
Vielen Dank für diesen Artikel. Leider sind alle darin enthaltenen Links zur Dokumentation defekt.

Danke für die Nachricht - die Hilfe wurde neu erstellt, daher die Fehler. Wir werden die Links korrigieren.

 
Vladimir Karputov:

Mittels der Klasse CCanvas?

P.S. Verwenden Sie CCanvas.CreateBitmap:

Erzeugt eine grafische Ressource, die an ein Diagrammobjekt gebunden ist.

1. Erzeugt eine grafische Ressource im Hauptfenster des aktuellen Diagramms.

bool CreateBitmap(
const string name, // name
const datetimetime, // Zeit
const doublePreis, // Preis
constintBreite, // Breite
const int Höhe, // Höhe
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// Format
);

So können Sie eine Ecke eines Canvas binden. Aber Breite und Höhe werden trotzdem in Pixeln angegeben.


Kann ich hier auf Russisch schreiben?

Weil Sie Anweisungen zu einem geben, aber in Wirklichkeit bekennen Sie sich Doppelstandards.

 
Alexey Kozitsyn:
Vielen Dank für den Artikel. Leider sind alle Links zur Dokumentation darin defekt.
Die Links sind korrigiert worden. Vielen Dank für die Nachricht.
 
Alexey Petrov:
Die Links sind korrigiert worden. Vielen Dank für die Nachricht.

Fehler bleiben bestehen.

Einleitung Absatz:

...

Bevor Sie anfangen, direkt mit der CCanvas-Klasse zu zeichnen, müssen Sie einige Definitionen im Zusammenhang mit der Farbbehandlung lernen. Zum Beispiel, was ist Transparenz und was ist ein Alphakanal.

...


Punkt "5.1 Erstellen eines Skripts "Illusion.mq5""

...

Zeichnen Sie einen gemalten Kreis. Der Kreis wird über die Farbe gezeichnet, mit der wir die Leinwand gefüllt haben (canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));).

canvas_XRGB_NOALPHA.CreateBitmapLabel - Hier haben wir eine Grafikressource erstellt, die an das Diagrammobjekt gebunden ist.

Füllen Sie die gesamte Leinwand mit Farbe im ARGB-Format mit Transparenz Alpha

Text ausgeben - Art der Bildverarbeitung für diese Leinwand. Textfarbe im ARGB-Format mit Alphakanal gleich 255, d.h. die Farbe des Ausgabetextes.

Wenn wir wollen, dass alles Gezeichnete auf dem Bildschirm angezeigt wird, müssen wir den Bildschirm aktualisieren.

Da wir die grafische Ressource mit einer Bindung an das Diagrammobjekt erstellt haben ( Methode CreateBitmapLabel), werden wir die Ressource mit der Methode Destroy() löschen.

...

 

Guten Tag, Leute, könnt ihr mir sagen, wie ich das Informationsfeld so gestalten kann, dass die Symbole der Angebote nicht überlagert werden.

Es scheint im Vordergrund zu sein, alles ist dahinter gezeichnet, aber die Geschäfte sind oben überlagert.

void CreateEdit(long             chart_id,         // Diagramm-ID
                int              sub_window,       // Nummer des Fensters (Unterfensters)
                string           name,             // Objektname
                color            font_color,       // Schriftfarbe
                int              x_size,           // Breite
                int              y_size,           // Höhe
                int              x_distance,       // Koordinate der X-Achse
                int              y_distance,       // Koordinate der Y-Achse
                long             z_order,          // Priorität
                color            background_color) // Hintergrundfarbe 
  {
// Wenn das Objekt erfolgreich erstellt wurde, dann...
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ...seine Eigenschaften einstellen
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // Einstellung des Winkels des Diagramms
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // Schriftfarbe
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // Hintergrundfarbe
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // Breite
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // Höhe
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // X-Koordinate festlegen
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // Einstellung der Y-Koordinate
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         // Objekt kann nicht ausgewählt werden, wenn FALSE
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // Objektpriorität
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // schreibgeschützt
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // linke Ausrichtung
      //--- Anzeige im Vordergrund (falsch) oder im Hintergrund (wahr) 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // kein Tooltip wenn "\n".
     }
  }