Discusión sobre el artículo "Estudiamos la clase CCanvas. Implementación de la transparencia de los objetos gráficos" - página 3

 
Vladimir, no se me da bien el lienzo....
Aquí va una pregunta.
Dibujo diferentes formas en el lienzo y las superpongo una sobre otra. ¿Cómo hacer para que los colores permanezcan originales sin mezclar?

Pongo COLOR_FORMAT_XRGB_NOALPHA, pero se produce la mezcla :-(((.

Sin embargo, tengo esta variante. Hay una imagen de tipo CPicture adjunta a un diálogo de tipo CDialog. Está vinculada a un recurso de tipo CCanvas. Este último se crea sin vincularse a una ventana.

 
Dennis Kirichenko:
Vladimir, no se me da bien el lienzo....
Aquí va una pregunta.
Dibujo diferentes formas en el lienzo y las superpongo una sobre otra. ¿Cómo hacer para que los colores permanezcan originales sin mezclar?

Me puse COLOR_FORMAT_XRGB_NOALPHA, pero la mezcla se lleva a cabo :-(((

...

Knavas

El color dibujado en el lienzo (llamémoslo "superior" o último) sustituye al color dibujado en el lienzo anteriormente.

//+------------------------------------------------------------------+
//|canvas+xor.mq5
//|Derechos de autor © 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"
//--- mostrar la ventana de parámetros de entrada al lanzar el script
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- entrada
input uchar alfa=150;         // canal alfa que gestiona la transparencia del color
//--- anchura y altura variables del gráfico.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- anchura y altura del gráfico
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- crear lienzo 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));
//--- crear un rectángulo #1
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- espera 3 segundos
   Sleep(3000);
//--- crear un rectángulo #2
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- espera 3 segundos
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| Ancho del gráfico|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- prepara la variable para obtener el valor de la propiedad
   long result=-1;
//--- restablecer el valor de error
   ResetLastError();
//--- recibir el valor de la propiedad
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- mostrar el mensaje de error en el diario Experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- devuelve el valor de la propiedad del gráfico
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Altura del gráfico|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- prepara la variable para obtener el valor de la propiedad
   long result=-1;
//--- restablecer el valor de error
   ResetLastError();
//--- recibir el valor de la propiedad
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- mostrar el mensaje de error en el diario Experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- devuelve el valor de la propiedad del gráfico
   return((int)result);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 

Vladimir, ¡muchas gracias!

Acabo de pasar por alto la conversión ColorToARGB().

 
Dennis Kirichenko:

Vladimir, ¡muchas gracias!

Se me había pasado la conversión ColorToARGB().

De nada :) .
 
Hola, creo que este artículo es excelente. Tengo una pregunta ¿cómo puedo hacer un rectángulo en la pantalla con coordenadas x1, x2, y1, y2. donde:

x1 = Tiempo[1]

x2 = Tiempo[0]

y1 = Abrir[1]

y2 = Cerrar[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
Hola, creo que este artículo es excelente. Tengo una pregunta ¿cómo puedo hacer un rectángulo en la pantalla con coordenadas x1, x2, y1, y2. donde:

x1 = Tiempo[1]

x2 = Tiempo[0]

y1 = Abrir[1]

y2 = Cerrar[1]

Mediante la clase CCanvas?

P.D. Utiliza CCanvas.CreateBitmap:

Crea un recurso gráfico ligado a un objeto gráfico.

1. Crea un recurso gráfico en la ventana principal del gráfico actual.

bool CreateBitmap(
const string name, // nombre
const datetimetime, // hora
const doubleprecio, // precio
constintanchura, // anchura
const int altura, // altura
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// formato
);

De esta forma podrás vincular una esquina de un Canvas. Pero la anchura y la altura, igualmente, se establecerán en píxeles.

 

Hagamos un ejercicio más fácil. Voy a poner un círculo se mueve con el precio; pero, ¿por qué no se mueve en el eje Y?

Este es el código

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:

Hagamos un ejercicio más fácil. Voy a poner un círculo se mueve con el precio; pero, ¿por qué no se mueve en el eje Y?

Este es el código

Este script no está compilado. En él un montón de errores.
 
Jorge Fernando De Los Ríos De Los Ríos:

Hagamos un ejercicio más fácil. Voy a poner un círculo se mueve con el precio; pero, ¿por qué no se mueve en el eje Y?

Este es el código

"Tiempo[]", "Cierre[]" - error. ¡No hay tales variables en MQL5!
 
Karputov Vladimir:
"Tiempo[]", "Cerrar[]" - error. ¡No existen tales variables en MQL5!
MQL4 ;)