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

 
Artyom Trishkin:
MQL4 ;)

Eu não dou boas-vindas à MQL4. Todos os exemplos estão apenas em MQL5.

//+------------------------------------------------------------------+
//|Teste.mq5 |
//|Direitos autorais © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
CCanvas     m_canvas;           // o objeto canvas
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
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 = Time[1];
//y1 = Open[1];
//x2 = Time[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();
  }
//+------------------------------------------------------------------+
//| Obtém a largura do gráfico (em pixels)|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Obtém a altura do gráfico (em pixels)
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+

E o resultado do script:

resultado

 

Vladimir, uma pergunta para você, que é um especialista.

Há um painel na forma de uma tela. E, em seguida, as linhas de tendência são desenhadas no gráfico. Como ocultá-las atrás da tela?

Capturas de tela da plataforma de negociação MetaTrader

RTS Splice, H1, 2016.10.16

JSC &#39;&#39;Otkritie Broker&#39;&#39;, MetaTrader 5, Demonstração

RTS Splice, H1, 2016.10.16, JSC ''Otkritie Broker'', MetaTrader 5, Demonstração


 
Dennis Kirichenko:

Vladimir, uma pergunta para você, que é um especialista.

Há um painel na forma de uma tela. E, em seguida, as linhas de tendência são desenhadas no gráfico. Como ocultá-las atrás da tela?


Por exemplo, destruir o painel e desenhá-las novamente....
 
Sim, obrigado. Até agora, tive a ideia de apenas colocar objetos no plano de fundo....
[Excluído]  
Vladimir Karputov:
Obrigado pelo artigo. Infelizmente, todos os links para a documentação nele contidos estão quebrados.
 
Alexey Kozitsyn:
Obrigado pelo artigo. Infelizmente, todos os links de documentação nele contidos estão quebrados.

Obrigado pela mensagem - a ajuda foi reconstruída, por isso os erros. Corrigiremos os links.

 
Vladimir Karputov:

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.


Posso escrever em russo aqui?

Porque você dá instruções para um, mas, na realidade, professa padrões duplos.

 
Alexey Kozitsyn:
Obrigado pelo artigo. Infelizmente, todos os links para a documentação nele contida estão quebrados.
Os links foram corrigidos. Obrigado pela mensagem.
 
Alexey Petrov:
Os links foram corrigidos. Obrigado pela mensagem.

Os erros permanecem.

Parágrafo de introdução:

...

Antes de começar a desenhar diretamente com a classe CCanvas, você precisa aprender algumas definições relacionadas ao manuseio de cores. Por exemplo, o que é transparência e o que é um canal alfa.

...


Item "5.1 Criar um script "Illusion.mq5""

...

Desenhe um círculo pintado. O círculo será desenhado sobre a cor com a qual preenchemos a tela (canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));).

canvas_XRGB_NOALPHA.CreateBitmapLabel - Aqui criamos um recurso gráfico vinculado ao objeto gráfico.

Preencher toda a tela com cor no formato ARGB com transparência alfa

Output text - tipo de processamento de imagem para essa tela. Cor do texto no formato ARGB com canal alfa igual a 255, ou seja, a cor do texto de saída.

Se quisermos que tudo o que foi desenhado seja exibido na tela, precisaremos atualizar a tela.

Como criamos o recurso gráfico com uma vinculação ao objeto gráfico ( método CreateBitmapLabel), excluiremos o recurso usando o método Destroy().

...

 

Saudações, pessoal, vocês podem me dizer como criar o painel de informações de modo que os ícones das ofertas não fiquem sobrepostos.

Ele parece estar em primeiro plano, tudo está desenhado atrás dele, mas as ofertas estão sobrepostas.

void CreateEdit(long             chart_id,         // id do gráfico
                int              sub_window,       // número da janela (subjanela)
                string           name,             // nome do objeto
                color            font_color,       // cor da fonte
                int              x_size,           // largura
                int              y_size,           // altura
                int              x_distance,       // Coordenada do eixo X
                int              y_distance,       // Coordenada do eixo Y
                long             z_order,          // prioridade
                color            background_color) // cor de fundo 
  {
// Se o objeto foi criado com sucesso, então...
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ...definir suas propriedades
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // definição do ângulo do gráfico
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // cor da fonte
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // cor de fundo
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // largura
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // altura
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // definir coordenada X
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // definição da coordenada Y
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         // objeto não pode ser selecionado se for FALSO
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // prioridade do objeto
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // somente leitura
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // alinhamento à esquerda
      //--- exibição em primeiro plano (falso) ou em segundo plano (verdadeiro) 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // nenhuma dica de ferramenta se "\n".
     }
  }