Discussion de l'article "Étudier la classe CCanvas. Comment dessiner des objets transparents" - page 3

 
Vladimir, je ne suis pas doué pour le canvas....
Voici une question.
Je dessine différentes formes dans le canevas et je les superpose. Comment faire pour que les couleurs restent originales sans mélange ?

Je règle COLOR_FORMAT_XRGB_NOALPHA, mais le mélange a lieu :-(((.

Cependant, j'ai cette variante. Il y a une image de type CPicture attachée à un dialogue de type CDialog. Elle est liée à une ressource de type CCanvas. Cette dernière est créée sans être liée à une fenêtre.

 
Dennis Kirichenko:
Vladimir, je ne suis pas doué pour le canvas....
Voici une question.
Je dessine différentes formes dans le canevas et je les superpose. Comment faire pour que les couleurs restent originales sans mélange ?

J'ai mis COLOR_FORMAT_XRGB_NOALPHA, mais le mélange a lieu :-(((

...

Knavas

La couleur dessinée dans le canevas (appelons-la "top" ou dernière) remplace la couleur dessinée dans le canevas plus tôt.

//+------------------------------------------------------------------+
//|canvas+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"
//--- afficher la fenêtre des paramètres d'entrée lors du lancement du script
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- entrée
input uchar alfa=150;         // canal alpha gérant la transparence des couleurs
//--- largeur et hauteur variables du graphique.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- largeur et hauteur du graphique
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- créer une toile 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));
//--- créer un rectangle #1
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- attendre 3 secondes
   Sleep(3000);
//--- créer un rectangle #2
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- attendre 3 secondes
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| Largeur de la propriété graphique|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- préparer la variable pour obtenir la valeur de la propriété
   long result=-1;
//--- réinitialiser la valeur de l'erreur
   ResetLastError();
//--- reçoit la valeur de la propriété
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- afficher le message d'erreur dans le journal des experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- renvoie la valeur de la propriété du graphique
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Hauteur de la propriété graphique|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- préparer la variable pour obtenir la valeur de la propriété
   long result=-1;
//--- réinitialiser la valeur de l'erreur
   ResetLastError();
//--- reçoit la valeur de la propriété
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- afficher le message d'erreur dans le journal des experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- renvoie la valeur de la propriété du graphique
   return((int)result);
  }
//+------------------------------------------------------------------+
Dossiers :
 

Vladimir, merci beaucoup !

J'ai juste oublié la conversion ColorToARGB().

 
Dennis Kirichenko:

Vladimir, merci beaucoup !

J'avais juste oublié la conversion ColorToARGB().

De rien :) .
 
Bonjour, je trouve cet article excellent. J'ai une question : comment puis-je créer un rectangle sur l'écran avec les coordonnées x1, x2, y1, y2. où :

x1 = Temps[1]

x2 = Temps[0]

y1 = Ouverture[1]

y2 = Fermeture[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
Bonjour, je trouve cet article excellent. J'ai une question : comment puis-je créer un rectangle sur l'écran avec les coordonnées x1, x2, y1, y2. où :

x1 = Temps[1]

x2 = Temps[0]

y1 = Ouverture[1]

y2 = Fermer[1]

Au moyen de la classe CCanvas ?

P.S. Utilisez CCanvas.CreateBitmap:

Crée une ressource graphique liée à un objet graphique.

1. Crée une ressource graphique dans la fenêtre principale du graphique actuel.

bool CreateBitmap(
const string nom, // nom
const datetimetime, // date
const doubleprice, // prix
constintwidth, // largeur
const int hauteur, // hauteur
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// format
) ;

Ainsi, vous pourrez lier un coin d'un Canvas. Mais la largeur et la hauteur seront tout de même exprimées en pixels.

 

Faisons un exercice plus facile. Je vais mettre un cercle qui se déplace avec le prix ; mais, pourquoi ne se déplace-t-il pas dans l'axe Y ?

C'est le 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:

Faisons un exercice plus facile. Je vais mettre un cercle qui se déplace avec le prix ; mais, pourquoi ne se déplace-t-il pas dans l'axe Y ?

Voici le code

Ce script n'est pas compilé. En lui un tas d'erreurs.
 
Jorge Fernando De Los Ríos De Los Ríos:

Faisons un exercice plus facile. Je vais mettre un cercle qui se déplace avec le prix ; mais, pourquoi ne se déplace-t-il pas dans l'axe Y ?

C'est le code

"Time[]", "Close[]" - est une erreur. De telles variables n'existent pas dans MQL5 !
 
Karputov Vladimir:
"Heure[]", "Fermeture[]" - erreur. De telles variables n'existent pas en MQL5 !
MQL4 ;)