Bibliotecas: Easy Canvas - página 12

 
Nikolai Semko:

Isso se aplica ao modo normal ou ao testador?

Modo normal, Nikolai.

 
Nikolai Semko:

Obrigado!

Essa função não é adequada?

Infelizmente não. Ela move o próprio objeto bitmap, mas preciso de uma função que mova os pontos x do conteúdo. Sei que internamente a memória consiste em uma matriz x, y, mas não há memmove ou algo do gênero no mql. Não sei como mover a memória rapidamente.

 
Владислав Качило :

Modo normal, Nikolai.

Geralmente, sigo o seguinte esquema:

  1. Realizo todos os desenhos, vinculados a barras ou tempo, em uma única função, por exemplo, void Draw()
  2. em OnChartEvent , adiciono a linha
    if (id == CHARTEVENT_CHART_CHANGE ) Draw (); 
    rastreando o evento de alteração do gráfico (uma nova barra também é um evento de alteração do gráfico).
  3. Em OnCalculate para o modo de teste, adiciono uma linha para redesenhar, por exemplo, quando ocorre uma nova barra, porque OnChartEvent não funciona:
    .
     if(rate_total-prev_calculated == 1) if (Canvas.tester) {ChartChanged (); Draw ();}

Se não funcionar no MT4, então há algo errado com o evento CHARTEVENT_CHART_CHANGE. Não posso verificar isso agora, pois ainda não há cotações.

 
Nikolai Semko:

Normalmente, faço o seguinte:

  1. Faço todo o desenho, vinculado às barras ou ao tempo, em uma função, por exemplo, void Draw()
  2. Adiciono uma linha a OnChartEvent para rastrear o evento de alteração do gráfico (uma nova barra também é um evento de alteração do gráfico).
  3. Em OnCalculate para o modo de teste, adiciono uma linha para redesenhar, por exemplo, quando ocorre uma nova barra, porque OnChartEvent não funciona:

Se não funcionar no MT4, então há algo errado com o evento CHARTEVENT_CHART_CHANGE. Não posso verificar isso agora, pois ainda não há cotações.

Nicholas, para que você não perca seu tempo, escrevi acima uma solução que resolveu meu problema, ou seja, como você notou corretamente, o seguinte código inserido em OnCalcucate():

if(rates_total - prev_calculated == 1)ChartChanged();

 
Mighty7:

Infelizmente, não. Ele move o próprio objeto bitmap, mas preciso de uma função que mova os pontos x do conteúdo. Sei que internamente a memória consiste em uma matriz x, y, mas não há memmove ou algo do gênero no mql. Não sei como mover a memória rapidamente.

Não entendi, você precisa mover a área retangular dentro de toda a tela?

 
Vladyslav Katsylo:

Nicholas, para que você não perca seu tempo, escrevi acima uma solução que resolveu meu problema, ou seja, como você observou corretamente, o seguinte código inserido em OnCalcucate():

No modo normal de não-teste, você não deve fazer isso, pois a função ChartChanged() será executada duas vezes seguidas, o que não é razoável. Afinal de contas, ela é executada quando o evento CHARTEVENT_CHART_CHANGE ocorre dentro do arquivo iCanvas.mqh.
É correto redesenhar a tela vinculada às barras ou ao tempo em OnChartEvent quando o evento de mudança de janela ( CHARTEVENT_CHART_CHANGE) ocorre sem usar ChartChanged().

 
Vladyslav Katsylo:

Nicholas, para que você não perca seu tempo, escrevi acima uma solução que resolveu meu problema, ou seja, como você observou corretamente, o seguinte código inserido em OnCalcucate():

Você precisa levar em consideração o seguinte:

  • ChartChanged() é executado toda vez que o evento CHARTEVENT_CHART_CHANGE ocorre em OnChartEvent dentro da classe iCanvas
  • O OnChartEvent dentro da classe iCanvas é executado primeiro e, em seguida, o OnChartEvent do seu código é executado .

Seu problema foi porque OnCalculate aparentemente é executado antes de OnChartEvent e, portanto, ChartChanged() ainda não foi processado.
É por isso que é razoável implementar o manipulador de redesenho exatamente em OnChartEvent e não em OnCalculate
. Isso deve ser feito especialmente porque o usuário pode alterar o tamanho da janela a qualquer momento. O evento CHARTEVENT_CHART_CHANGE é responsável por tudo isso

 
Nikolai Semko:

Não entendi, você precisa mover a área retangular dentro de toda a tela?

Sim. Exemplo: desenho um círculo no meio da tela cheia e quero mover o círculo para a esquerda, mas não quero excluir toda a área e repintar o círculo a cada movimento, mas simplesmente rolar a memória para a esquerda.

O CCanvas é simplesmente uma matriz x/y de pontos.

   uint              m_pixels[];               // matriz de pixels
//+------------------------------------------------------------------+
//| Obter a cor do pixel|
//+------------------------------------------------------------------+
uint CCanvas::PixelGet(const int x,const int y) const
  {
//--- verificar coordenadas
   if(x>=0 && x<m_width && y>=0 && y<m_height)
      return(m_pixels[y*m_width+x]);
//--- erro
   return(0);
  }

Quero dizer uma função que mova os m_pixels para a esquerda, para a direita, para cima e para baixo.

 
Mighty7:

Sim. Exemplo: desenho um círculo no meio da tela cheia e quero mover o círculo para a esquerda, mas não quero excluir toda a área e repintar o círculo a cada movimento, mas simplesmente rolar a memória para a esquerda.

O CCanvas é simplesmente uma matriz x/y de pontos.

Quero dizer uma função que mova os m_pixels para a esquerda, para a direita, para cima e para baixo.

Sim, é um desejo razoável.
Além disso, não é difícil implementá-lo.
Pensei sobre isso, mas cheguei à conclusão de que, se houver necessidade de mover a parte retangular da tela comum, há uma maneira mais fácil de implementá-la:

  • Criar uma nova tela menor. Nesse caso, você não precisa se preocupar em preencher o plano de fundo da parte a ser movida.

Sim, um desejo bem fundamentado.
Além disso, não é difícil implementá-lo.
Pensei sobre isso, mas cheguei à conclusão de que, se houver necessidade de mover a parte retangular da tela comum, há uma maneira mais fácil de implementá-la:
  • Criar uma tela nova e menor. Nesse caso, você não precisa se preocupar em preencher o plano de fundo da parte móvel.
 
Nikolai Semko:

Sim, é um desejo bastante razoável.
Além disso, não é difícil implementá-lo.
Pensei nisso, mas cheguei à conclusão de que, se houver necessidade de mover a parte retangular da tela geral, há uma maneira mais fácil de implementá-la:

  • Criar uma nova tela menor. Nesse caso, você não precisa se preocupar em preencher o plano de fundo da parte a ser movida.

Sim, um desejo bem fundamentado.
Além disso, não é difícil implementá-lo.
Pensei sobre isso, mas cheguei à conclusão de que, se houver necessidade de mover a parte retangular da tela comum, há uma maneira mais fácil de implementá-la:
  • Criar uma tela nova e menor. Nesse caso, você não precisa se preocupar em preencher o plano de fundo da parte móvel.

Isso não está funcionando porque meu Canvas é de tela cheia. É como um gráfico de ticks, mas é muito demorado apagar todo o plano de fundo, construir e pintar tudo de novo, então preciso mover o conteúdo para a esquerda (por exemplo, 8 pixels) e desenhar apenas os novos 8 pixels (8 px na direção x e altura total) com novos dados. Tentei mover o Canvas 8 px para a esquerda com MoveCanvas e isso está funcionando, mas não consigo redimensioná-lo de forma que 8 px de largura sejam removidos da esquerda e 8 px sejam adicionados à direita. Espero que você entenda...