Discussão do artigo "Estudando a Classe CCanvas. Como Desenhar Objetos Transparentes" - página 3

 
Vladimir, não sou bom em canvas....
Esta é uma pergunta.
Eu desenho formas diferentes na tela e as sobreponho umas às outras. Como fazer com que as cores permaneçam originais sem mesclagem?

Defino COLOR_FORMAT_XRGB_NOALPHA, mas a mistura ocorre :-((((.

No entanto, tenho esta variante. Há uma imagem do tipo CPicture anexada a uma caixa de diálogo do tipo CDialog. Ela está vinculada a um recurso do tipo CCanvas. Este último é criado sem ser vinculado a uma janela.

 
Dennis Kirichenko:
Vladimir, não sou bom em canvas....
Esta é uma pergunta.
Eu desenho formas diferentes na tela e as sobreponho umas às outras. Como fazer com que as cores permaneçam originais sem mesclagem?

Defino COLOR_FORMAT_XRGB_NOALPHA, mas a mesclagem ocorre :-((((

...

Knavas

A cor desenhada na tela (vamos chamá-la de "superior" ou última) substitui a cor desenhada na tela anteriormente.

//+------------------------------------------------------------------+
//|canvas+xor.mq5 |
//|Direitos autorais © 2015, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- mostrar a janela de parâmetros de entrada ao iniciar o script
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- entrada
input uchar alfa=150;         // canal alfa que gerencia a transparência da cor
//--- Largura e altura variáveis do gráfico.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- largura e altura do gráfico
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- criar tela 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));
//--- criar um retângulo #1
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- esperar por 3 segundos
   Sleep(3000);
//--- criar um retâ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();
//--- esperar por 3 segundos
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| Largura da propriedade do gráfico|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- preparar a variável para obter o valor da propriedade
   long result=-1;
//--- redefinir o valor do erro
   ResetLastError();
//--- receber o valor da propriedade
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- exibir a mensagem de erro no diário do Experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- retorna o valor da propriedade do gráfico
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Altura da propriedade do gráfico|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- preparar a variável para obter o valor da propriedade
   long result=-1;
//--- redefinir o valor do erro
   ResetLastError();
//--- receber o valor da propriedade
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- exibir a mensagem de erro no diário do Experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- retorna o valor da propriedade do gráfico
   return((int)result);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 

Vladimir, muito obrigado!

Eu simplesmente esqueci a conversão ColorToARGB().

 
Dennis Kirichenko:

Vladimir, muito obrigado!

Eu simplesmente esqueci a conversão ColorToARGB().

De nada :) .
 
Olá, acho que este artigo é excelente. Tenho uma pergunta: como posso criar um retângulo na tela com as coordenadas x1, x2, y1, y2. onde:

x1 = Tempo[1]

x2 = Tempo[0]

y1 = Open[1]

y2 = Close[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
Olá, acho que este artigo é excelente. Tenho uma pergunta: como posso criar um retângulo na tela com as coordenadas x1, x2, y1, y2. onde:

x1 = Tempo[1]

x2 = Tempo[0]

y1 = Open[1]

y2 = Close[1]

Por meio da classe CCanvas?

P.S. Use CCanvas.CreateBitmap:

Cria um recurso gráfico vinculado a um objeto de gráfico.

1. Cria um recurso gráfico na janela principal do gráfico atual.

bool CreateBitmap(
const string name, // name
const datetimetime, // hora
const doubleprice, // preço
constint width, // largura
const int height, // altura
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// formato
);

Assim, você poderá vincular um canto de um Canvas. Mas a largura e a altura, mesmo assim, serão definidas em pixels.

 

Vamos fazer um exercício mais fácil. Vou colocar um círculo que se move com o preço; mas, por que ele não se move no eixo Y?

Esse é o 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:

Vamos fazer um exercício mais simples. Vou colocar um círculo que se move com o preço; mas, por que ele não se move no eixo Y?

Esse é o código

Esse script não foi compilado. Nele, há um monte de erros.
 
Jorge Fernando De Los Ríos De Los Ríos:

Vamos fazer um exercício mais simples. Vou colocar um círculo que se move com o preço; mas, por que ele não se move no eixo Y?

Esse é o código

"Time[]", "Close[]" - erro. Essas variáveis não existem na MQL5!
 
Karputov Vladimir:
"Time[]", "Close[]" - erro. Essas variáveis não existem na MQL5!
MQL4 ;)