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

 
Vladimir, ich bin nicht gut in Canvas....
Ich habe eine Frage.
Ich zeichne verschiedene Formen in die Leinwand und überlagere sie miteinander. Wie kann ich erreichen, dass die Farben ohne Überblendung erhalten bleiben?

Ich stelle COLOR_FORMAT_XRGB_NOALPHA ein, aber die Mischung findet statt :-(((.

Ich habe jedoch diese Variante. Es gibt ein Bild vom Typ CPicture, das mit einem Dialog vom Typ CDialog verknüpft ist. Es ist mit einer Ressource vom Typ CCanvas verknüpft. Letztere wird ohne Bindung an ein Fenster erstellt.

 
Dennis Kirichenko:
Vladimir, ich bin nicht gut in Canvas....
Ich habe eine Frage.
Ich zeichne verschiedene Formen in die Leinwand und überlagere sie miteinander. Wie kann ich erreichen, dass die Farben ohne Überblendung erhalten bleiben?

Ich stelle COLOR_FORMAT_XRGB_NOALPHA ein, aber die Überlagerung findet statt :-(((

...

Knavas

Die im Canvas gezeichnete Farbe (nennen wir sie "oben" oder zuletzt) ersetzt die zuvor im Canvas gezeichnete Farbe.

//+------------------------------------------------------------------+
//|Leinwand+xor.mq5 |
//|Copyright © 2015, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- Anzeige des Fensters mit den Eingabeparametern beim Starten des Skripts
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- Eingabe
input uchar alfa=150;         // Alphakanal zur Verwaltung der Farbtransparenz
//--- variable Breite und Höhe des Diagramms.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Breite und Höhe des Diagramms
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- Leinwand erstellen COLOR_FORMAT_XRGB_NOALPHA
   CCanvas canvas_XARGB_NORMALIZE;
   if(!canvas_XARGB_NORMALIZE.CreateBitmapLabel("canvas_XARGB_NORMALIZE",0,0,
      ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return;
     }
   canvas_XARGB_NORMALIZE.Erase(ColorToARGB(clrAqua,255));
//--- ein Rechteck #1 erstellen
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3 Sekunden lang warten
   Sleep(3000);
//--- ein Rechteck erstellen #2
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3 Sekunden lang warten
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| Chart-Eigenschaft Breite|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Diagramm-Eigenschaft Höhe|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
Dateien:
 

Vladimir, ich danke dir sehr!

Ich habe gerade die ColorToARGB()-Konvertierung übersehen.

 
Dennis Kirichenko:

Vladimir, ich danke dir sehr!

Ich habe gerade die ColorToARGB()-Konvertierung übersehen.

Gern geschehen :) .
 
Hallo, ich denke, dieser Artikel ist ausgezeichnet. Ich habe eine Frage, wie kann ich ein Rechteck auf dem Bildschirm mit den Koordinaten x1, x2, y1, y2. machen, wobei:

x1 = Zeit[1]

x2 = Zeit[0]

y1 = Öffnen[1]

y2 = Schließen[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
Hallo, ich denke, dieser Artikel ist ausgezeichnet. Ich habe eine Frage, wie kann ich ein Rechteck auf dem Bildschirm mit den Koordinaten x1, x2, y1, y2. machen, wobei:

x1 = Zeit[1]

x2 = Zeit[0]

y1 = Öffnen[1]

y2 = Schließen[1]

Mit Hilfe 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 Pixel angegeben.

 

Lassen Sie uns eine Übung leichter tun. Ich gehe, um einen Kreis zu setzen bewegt sich mit dem Preis; aber, warum nicht es in der Achse Y bewegen?

Das ist der Code

void OnStart()
  {
   int ChartWidth=ChartWidthInPixels();
   int ChartHeight=ChartHeightInPixelsGet();

   CCanvas pepe;

   int t1,t0,p1,p0;
   ChartTimePriceToXY(0,0,Time[1],Open[1],t1,p1);
   ChartTimePriceToXY(0,0,Time[0],Close[1],t0,p0);

   pepe.CreateBitmapLabel("canvas_XRGB_NOALPHA",0,0,ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_RAW);
   pepe.Erase(0);
   pepe.FillCircle(t0,p0,25,ColorToARGB(clrBlue,255));
   pepe.Update();
   return(rates_total);
  } 
 
Jorge Fernando De Los Ríos De Los Ríos:

Lassen Sie uns eine Übung leichter tun. Ich gehe, um einen Kreis zu setzen bewegt sich mit dem Preis; aber, warum nicht es in der Achse Y bewegen?

Das ist der Code

Dieses Skript ist nicht kompiliert. In ihm ein Haufen von Fehlern.
 
Jorge Fernando De Los Ríos De Los Ríos:

Lassen Sie uns eine Übung leichter tun. Ich gehe, um einen Kreis zu setzen bewegt sich mit dem Preis; aber, warum nicht es in der Achse Y bewegen?

Das ist der Code

"Zeit[]", "Schluss[]" - Fehler. Es gibt keine solchen Variablen in MQL5!
 
Karputov Vladimir:
"Zeit[]", "Schließen[]" - Fehler. Es gibt keine solchen Variablen in MQL5!
MQL4 ;)