Unleash the power of dynamic data representation in your trading strategies or utilities with our comprehensive guide on creating movable GUI in MQL5. Dive into the core concept of chart events and learn how to design and implement simple and multiple movable GUI on the same chart. This article also explores the process of adding elements to your GUI, enhancing their functionality and aesthetic appeal.
Nikolai Semko #: Aqui, por exemplo, esbocei um script que demonstra isso claramente. À direita está esse algoritmo rápido, e à esquerda está o meu (cerca de 4 a 10 vezes mais lento). .
Posso reduzir a imagem Bmp, mas a tela permanece do mesmo tamanho. Pelo mesmo motivo, não posso ampliar a imagem, pois ela é cortada no tamanho original, ou seja, no tamanho da tela.
Não entendo muito bem de arrays, então você poderia me explicar ou, melhor ainda, mostrar um exemplo com código:
1. Ampliação da imagem
2. Uma tela igual ao tamanho da imagem, se a tivermos reduzido ou ampliado.
Posso reduzir a imagem Bmp, mas a tela permanece do mesmo tamanho. Pelo mesmo motivo, não posso ampliar a imagem, pois ela é cortada no tamanho original, ou seja, no tamanho da tela.
Não entendo muito bem de arrays, então você poderia me explicar ou, melhor ainda, mostrar um exemplo com código:
1. Ampliação da imagem
2. Uma tela igual ao tamanho da imagem, se a tivermos reduzido ou ampliado.
Legal e útil. Só por curiosidade, isso pode ser usado no MT4?
Infelizmente, na MQL4 não há possibilidade de anexar um recurso como uma matriz. Mas todo o resto funciona.
É claro que isso pode ser implementado por meio de pandeiros rígidos. Por exemplo, insira uma imagem PNG em um arquivo BMP, ou seja, adicione um cabeçalho BMP ao início do png e passe o próprio png como uma imagem bmp (ou seja, se você abrir esse BMP, haverá um ruído de pixels coloridos de transparência diferente). E, em seguida, anexe esse "arquivo bmp" como um recurso em MQL4. Isso pode ser necessário para o mercado, de modo que o ex4 já contenha uma imagem de um formato png mais denso.
Para referência: png é cerca de 10 vezes menor do que a mesma imagem BMP sem perda de qualidade, além de suportar transparência total.
O verdadeiro recurso bmp no arquivo ex5(ex4) é armazenado em um formato compactado, mas não em uma ordem de magnitude menor. É necessário verificar com exatidão.
Nikolai Semko #: Ok, vou lhe dar um exemplo mais tarde.
Mas eu prefiro trabalhar com uma tela para todo o gráfico. Isso se justifica em 95% das vezes.
Aqui está um exemplo baseado na biblioteca png.mql, quando o movimento do mouse muda a posição da tela e altera seu tamanho. Se o ponteiro do mouse estiver no centro horizontalmente, ele corresponderá ao tamanho original da imagem; se estiver à esquerda, diminuirá o zoom; se estiver à direita, aumentará o zoom. Só que tive de alterar as variáveis C e _C em png.mql de privadas para públicas. Portanto, você precisa sobrescrever essa biblioteca se ela já estiver instalada. Esse exemplo tem dois modos de operação (variável de entrada bool resize_canvas):
com redimensionamento do Canvas toda vez que a imagem é redimensionada
sem redimensionar o Canvas toda vez que a imagem for redimensionada. O tamanho inicial do Canvas é definido como o tamanho máximo possível da imagem, de acordo com a lógica de trabalho.
Infelizmente, no primeiro modo em MQL5 há um bug antigo de imagem piscando, que pode ser curado apenas de uma maneira - não alterar o tamanho da tela. Todas as minhas tentativas de alterar a função CCanvas.Resize() não levaram a nada. Tudo pisca da mesma forma. Talvez alguém consiga fazer isso :))) É por isso que prefiro usar uma tela para toda a tela!
#define MAX_ZOOM 2#include <Canvas\png.mqh> //https://www.mql5.com/en/code/45439
CPng img("cubes.png"); // Get PNG from a file, create a canvas and display it on the screen at coordinates (X=500, Y=100)inputbool resize_canvas = false;
int chart_width,chart_height;
//+------------------------------------------------------------------+intOnInit() {
img.Resize(resize_canvas?10:img.width*MAX_ZOOM); // формируем массив _bmp[] максимального размера в режиме без изменения размера canvasChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
chart_width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
chart_height = (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
img._CreateCanvas(chart_width/3, chart_height/3);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+voidOnDeinit(constint reason) {
}
//+------------------------------------------------------------------+voidOnTick() {
}
//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam) {
if (id == CHARTEVENT_MOUSE_MOVE) {
double new_width = img.width*(MAX_ZOOM*(double)lparam/chart_width);
img.Resize(new_width);
if (resize_canvas) { // режим с изменением размера canvas Моргает!!!img._C.Resize(img._width,img._height);ArrayCopy(img._C.m_pixels,img._bmp);
} else { // режим без изменения размера canvas не Мограет!!!img._C.Erase(0x00FFFFFF);for(int i =0; i++<img._height;) ArrayCopy(img._C.m_pixels,img._bmp,int(i*img.width*MAX_ZOOM),i*img._width,img._width);
}
img._C.Update();
img._MoveCanvas(int(lparam)/5, int(dparam)/5);
}
}
Forget about BMP files like a bad dream. Thanks to this library, you can now use the PNG format, which has a number of advantages, such as being more compact without losing image quality and maintaining transparency.
Você poderia começar por este artigo: https: //www.mql5.com/en/articles/12751
Você poderia começar por este artigo: https: //www.mql5.com/en/articles/12751
Ótimo... Muito obrigado!
Eu já lhe dei um exemplo há 4 anos :))
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Como converter todos os objetos em um único objeto?
Nikolai Semko, 2019.10.05 22:39
De fato, o Canvas é a solução.
E o Canvas é muito mais fácil do que parece à primeira vista.
Aqui está um exemplo primitivo de um indicador (MQL5 e MQL4) com um objeto OBJ_BITMAP_LABEL no qual há muitas janelas.
Neste novo artigo, outra opção para implementar painéis de informações.
https://www.mql5.com/ru/articles/13179

Aqui, por exemplo, esbocei um script que demonstra isso claramente. À direita está esse algoritmo rápido, e à esquerda está o meu (cerca de 4 a 10 vezes mais lento).
.
Posso reduzir a imagem Bmp, mas a tela permanece do mesmo tamanho. Pelo mesmo motivo, não posso ampliar a imagem, pois ela é cortada no tamanho original, ou seja, no tamanho da tela.
Não entendo muito bem de arrays, então você poderia me explicar ou, melhor ainda, mostrar um exemplo com código:
1. Ampliação da imagem
2. Uma tela igual ao tamanho da imagem, se a tivermos reduzido ou ampliado.
Obrigado.
Nikolai Semko, olá. Neste exemplo https://www.mql5.com/ru/forum/227736/page66#comment_20456641, você demonstrou o redimensionamento (redução) de Bmp.
Posso reduzir a imagem Bmp, mas a tela permanece do mesmo tamanho. Pelo mesmo motivo, não posso ampliar a imagem, pois ela é cortada no tamanho original, ou seja, no tamanho da tela.
Não entendo muito bem de arrays, então você poderia me explicar ou, melhor ainda, mostrar um exemplo com código:
1. Ampliação da imagem
2. Uma tela igual ao tamanho da imagem, se a tivermos reduzido ou ampliado.
Obrigado.
Legal e útil. Só por curiosidade, isso pode ser usado no MT4?
Bom dia a todos. Também estou interessado nesse código. Mas ao usar Resize(), ele não funciona. Talvez isso deva ser feito em uma sequência diferente.
Bom dia a todos. Também estou interessado nesse código. Mas ao usar Resize(), ele não funciona. Talvez isso deva ser feito em uma sequência diferente.
Ok, vou lhe dar um exemplo mais tarde.
Ficaria muito grato se me enviasse um exemplo de código. Desde já, obrigado...
Ok, vou lhe dar um exemplo mais tarde.
Aqui está um exemplo baseado na biblioteca png.mql, quando o movimento do mouse muda a posição da tela e altera seu tamanho. Se o ponteiro do mouse estiver no centro horizontalmente, ele corresponderá ao tamanho original da imagem; se estiver à esquerda, diminuirá o zoom; se estiver à direita, aumentará o zoom.
Só que tive de alterar as variáveis C e _C em png.mql de privadas para públicas. Portanto, você precisa sobrescrever essa biblioteca se ela já estiver instalada.
Esse exemplo tem dois modos de operação (variável de entrada bool resize_canvas):
É por isso que prefiro usar uma tela para toda a tela!