Bibliotecas: Easy Canvas - página 13

 
Mighty7:

Levaria muito tempo para apagar todo o plano de fundo, construir e pintar tudo de novo

Não tanto assim. A construção pode levar muito tempo.

Mantemos o estado na memória (posição dos elementos, sua cor etc.) e, se precisarmos, por exemplo, mover um elemento, alteramos suas coordenadas, apagamos a tela e desenhamos um novo estado. Visualmente, parece muito rápido, mesmo com muitos elementos)

 
Mighty7:

Isso não está funcionando porque meu Canvas está em 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...

Mighty7:

Isso não está funcionando porque meu Canvas está em 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 somente 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...

Ok, pronto. Baixe a versão 1.42.
Mas você precisa controlar o redimensionamento vertical.

Pronto, já está. Faça o download da versão 1.42 para você.
Mas você precisa controlar a alteração na escala vertical.

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/pt/code/22164

input int shift = -1;
//+------------------------------------------------------------------+
int OnInit() {
   EventSetMillisecondTimer(100);
   Canvas.Erase(0x00FFFFFF);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTimer() {
   Canvas.FillCircle(rand()%_Width,rand()%_Height, 10+rand()%100,Canvas.Grad(rand()/32767.0)&0x80FFFFFF);
   Canvas.ShiftCanvas(shift);
   Canvas.Update();
   
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
   return(rates_total);
}
void              ShiftCanvas(const int _shift=-1, uint bckgr = 0x00FFFFFF) { // deslocar a tela inteira para a esquerda (x é um valor negativo) ou para
                     // à direita (x é um valor positivo). A tela em si permanece no lugar, mas todos os pixels são deslocados. O bckgr é 
                     // a cor com a qual a faixa recém-criada é preenchida à esquerda ou à direita, dependendo da direção do deslocamento.
                        if (_shift==0) return;
                        int _Shift = Fabs(_shift);
                        if (_Shift>=m_width) { ArrayInitialize(m_pixels,bckgr); return;}
                        int start = (_shift>0)?0:-_shift;
                        int count = m_width-_Shift;
                        int offset= (_shift>0)?0:count;
                        for (; start<m_height*m_width; start+=m_width, offset+=m_width) {                        
                           ArrayCopy(m_pixels,m_pixels,start+_shift,start,count); 
                           ArrayFill(m_pixels,offset,_Shift,bckgr);
                        }                        
                     }



Arquivos anexados:
 
Muito bom. Muito obrigado.
 
Mighty7:
Muito bom. Muito obrigado.
Sem problemas 😊
 
Nikolai Semko:
Sem problemas 😊

Funciona como um charme, mas para ficar completo, é possível implementar um Shift também
no eixo y (norte/sul)? Preciso que ele role/desloque nessas direções também.

 
Mighty7:

Ele funciona como um charme, mas, para ficar completo, é possível implementar um Shift também
no eixo y (norte/sul)? Preciso que ele role/desloque também nessas direções.

OK. Eu farei isso.

 
Mighty7:

Ele funciona como um charme, mas, para ficar completo, é possível implementar um Shift também
no eixo y (norte/sul)? Preciso que ele role/desloque também nessas direções.

Feito

ver 1.43

Arquivos anexados:
 
Nikolai Semko :

getan

veja 1.43

Absolutamente brilhante. Muito obrigado.

Edit: x=-1,y=0 não está se deslocando, portanto não está funcionando corretamente.

 
Mighty7:

Absolutamente brilhante. Muito obrigado.

Edit: x=-1,y=0 não está se deslocando, portanto não está funcionando corretamente.

Obrigado. Corrigido.

Arquivos anexados:
iCanvas.mqh  52 kb
 
Nikolai Semko:

Obrigado. Corrigido.

Tenho que agradecer. Agora está perfeito. Melhor trabalho.