A lona é legal! - página 44

 
Nikolai Semko:

Estas funções estão horrivelmente mal escritas. É uma coisa dos diabos. Sem serrilhamento normal, sem manipulação normal de mistura de cores e transparência. Devemos apenas amarrogá-los e jogá-los no lixo e escrever novos.
Eu já escrevi sobre isso aqui antes.

Em qualquer caso, você deve definitivamente substituir a função padrão da PixelTransform por esta:

https://www.mql5.com/ru/forum/1111/page2553#comment_13054823

Comecei a escrever minha versão dupla (onde todos os parâmetros de entrada são duplos), mas não a terminei e a coloquei na prateleira. Não é uma tarefa muito simples, apesar de sua aparente simplicidade. Bem, não é um problema escrevê-lo com precisão, o problema é escrever com uma qualidade muito alta, para tornar o algoritmo rápido. Meu principal problema é o perfeccionismo.

Estou vendo, eles ainda não terminaram)

É pouco provável que eu me sinta tentado a reescrever a tela inteira. Terei que desenhar 2 de um pixel lado a lado em vez de 1 de dois pixel por enquanto )

 
Andrey Khatimlianskii:

Estou vendo, eles não o terminaram).

Não é provável que eu seja tentado a reescrever a tela inteira. Só terei que desenhar 2 de um pixel lado a lado em vez de 1 de duplo pixel).

Você não precisa reescrever a tela inteira. O principal é fazer um formato de círculo

Circle(double x, double y, double r1, double r2=0, uint clr)  

e tornar as linhas normais.

Polyline(const double &x[],const double &y[], const uint clr,const double size,const uint style,ENUM_LINE_END end_style)

Isto deve cobrir 95% de suas necessidades

 

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Como converter todos os objetos em 1 objeto

Nikolai Semko, 2019.10.05 22:39

De fato, a lona é a solução.

E a lona é muito mais fácil do que parece à primeira vista.

Aqui está um exemplo primitivo de um indicador (MQL5 & MQL4) com um objeto OBJ_BITMAP_LABEL no qual há muitas janelas.

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164 - MQL5
                              //https://www.mql5.com/en/code/23840 - MQL4

struct win {
   int               x;
   int               y;
   int               width;
   int               height;
   uint              clr;
};
win wnd[30];
int OnInit() {
   for (int i=0; i<ArraySize(wnd); i++) {
      wnd[i].width=rand()%200+70;
      wnd[i].height=rand()%150+50;
      wnd[i].x=rand()%(W.Width-wnd[i].width);
      wnd[i].y=rand()%(W.Height-wnd[i].height);
      wnd[i].clr=ARGB(255,rand()%150+100,rand()%150+100,rand()%150+100);
   }
   ShowAllWind();
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return(rates_total);
}

//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   static bool click = false;
   static int x_mouse=0, y_mouse=0;
   static int focus=-1, xfocus=0, yfocus=0;
   int x=(int)lparam;
   int y=(int)dparam;
   if (sparam!="1" && click) focus=-1;
   if (sparam=="1" && !click) {
      focus=-1;
      for (int i=ArraySize(wnd)-1; i>=0; i--) {
         if (wnd[i].x<x && wnd[i].y<y && wnd[i].x+wnd[i].width>x && wnd[i].y+20>y) {
            focus=i;
            xfocus=x;
            yfocus=y;
            break;
         }
      }
      if (focus>=0) ChartSetInteger(0,CHART_MOUSE_SCROLL,false);
      else ChartSetInteger(0,CHART_MOUSE_SCROLL,true);
   }
   click=(sparam=="1")?true:false;
   if (id==CHARTEVENT_MOUSE_MOVE && focus>=0) {
      wnd[focus].x+=x-xfocus;
      wnd[focus].y+=y-yfocus;
      xfocus=x;
      yfocus=y;
      ShowAllWind();
   }
   if (id==CHARTEVENT_CHART_CHANGE) ShowAllWind();
}

//+------------------------------------------------------------------+

void ShowAllWind() {
   Canvas.Erase();
   for (int i=0; i<ArraySize(wnd); i++) {
      Canvas.FillRectangle(wnd[i].x,wnd[i].y,wnd[i].x+wnd[i].width,wnd[i].y+wnd[i].height,ARGB(255,GETRGBR(wnd[i].clr)*0.5,GETRGBG(wnd[i].clr)*0.5,GETRGBB(wnd[i].clr)*0.5));
      Canvas.FillRectangle(wnd[i].x+3,wnd[i].y+23,wnd[i].x+wnd[i].width-3,wnd[i].y+wnd[i].height-3,wnd[i].clr);
      Canvas.FillRectangle(wnd[i].x+3,wnd[i].y+3,wnd[i].x+wnd[i].width-3,wnd[i].y+20,ARGB(255,GETRGBR(wnd[i].clr)*0.7,GETRGBG(wnd[i].clr)*0.7,GETRGBB(wnd[i].clr)*0.7));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+

 
Nikolai Semko:

Ótimo!

Eu realmente preciso desta característica e para poder desenhar meus próprios indicadores nestas mini-janelas.

Por que uma janela está escondida sob outra e a outra deitada em cima, você pode consertá-la?

Outra pergunta, se o mesmo indicador for executado em um gráfico diferente, ele funcionará? Os eventos não se sobreporão como na biblioteca padrão?

E se ambas as janelas tiverem as mesmas coordenadas, qual janela será arrastada com o mouse?

É possível redimensionar a janela com o mouse?

 
Sergey Chalyshev:

Ótimo!

Eu realmente preciso desta característica e para poder desenhar meus próprios indicadores nestas mini-janelas.

Por que uma janela está escondida sob outra e a outra deitada em cima, você pode consertá-la?

Outra pergunta, se o mesmo indicador for executado em um gráfico diferente, será que funcionará? Os eventos não se sobreporão como na biblioteca padrão?

E se ambas as janelas tiverem as mesmas coordenadas, qual janela será arrastada com o mouse?

É possível redimensionar a janela com o mouse?

Este exemplo simplesmente implementa a antiguidade da janela. Na verdade, quanto menor é o índice na matriz da estrutura vencedora, mais baixa é a camada da janela virtual.

Você pode implementá-lo da maneira que quiser. Por exemplo, se "agarrarmos" uma janela, ela se torna a mais alta na tela e na matriz.

Você também pode implementar a transparência. Eu lhe mostrei como fazer isso aqui . (lá é necessário processar cada piskel).

O outro gráfico também pode ser executado no outro.
Se as coordenadas forem as mesmas, a de cima é arrastada.

com kanvas você pode fazer tudo dentro de sua janela e outras janelas MT.
Além disso, você pode destacar uma janela do MT5 e enviá-la flutuando livremente, mesmo entre monitores. Você pode vê-loaqui .

 
Nikolai Semko:

Este exemplo simplesmente implementa a antiguidade da janela. Essencialmente, quanto menor o índice na matriz da estrutura vencedora, mais baixa a camada da janela virtual.

Você pode implementá-lo da maneira que quiser. Por exemplo, se uma janela é "agarrada", então ela se torna a mais alta na tela e na matriz.

Você também pode implementar a transparência. Eu lhe mostrei como fazer isso aqui . (aí você tem que processar cada piskel).

Eu também posso executá-lo em outro gráfico.
Se as coordenadas forem as mesmas, a de cima é arrastada.

Com kanvas você pode fazer tudo dentro de sua janela e outras janelas MT.
Além disso, a janela pode ser separada do МТ5 e movida para a zona de flutuação livre entre monitores. Você pode vê-lo aqui .

Ligeiramente errado, provavelmente não fez a pergunta corretamente.

Não é difícil organizar várias janelas em um programa (roteiro, indicador).

Quero fazer um indicador que mostre os dados em sua própria pequena janela em um gráfico. Esta janela pode ser colocada confortavelmente em um gráfico, você pode arrastá-la com seu mouse, redimensionar a janela com seu mouse (é desejável, mas você pode fazê-lo de qualquer maneira). Temos que executar vários indicadores no gráfico, cada um com seus próprios parâmetros. Ainda não descobri como fazer com que eventos de diferentes indicadores não se sobreponham e o indicador reagirá adequadamente aos eventos do mouse. Ainda não decidi o que é melhor, mais simples, lona ou objetos. Nada funciona com a biblioteca padrão do Diálogo.

 
Sergey Chalyshev:

...Ainda não se sabe como fazer com que os eventos de diferentes indicadores não se sobreponham...

A maneira mais fácil é uma variável de string na janela de propriedades, adicione-a aos nomes dos objetos gráficos.

 
Dmitry Fedoseev:

A maneira mais fácil é uma variável de string na janela de propriedades, adicione-a aos nomes dos objetos gráficos. Mente dividida entre verdade e filiação?

Naturalmente, é isso que eu faço. O problema é arrastar e soltar com o mouse. Se os objetos tiverem as mesmas coordenadas, uma está exatamente abaixo da outra. Quando você clica neles, qual deles reage?

De que clubes você está falando, não estou inscrito em nenhum clube e não tenho a intenção de ))

p.s. você pode me mostrar um exemplo?

 
Sergey Chalyshev:

Naturalmente, eu faço. O problema é arrastar e soltar com o mouse. Se os objetos tiverem as mesmas coordenadas, uma está exatamente abaixo da outra. Quando você clica neles, qual deles reage?

De que clubes você está falando, não estou inscrito em nenhum clube e não tenho a intenção de ))

p.s. você pode me mostrar um exemplo?

Clube errado, desculpe... Já terminei com este clube)).

Alguns objetos responderão. Talvez ao ativar um objeto mude sua ordem Z para que ele seja superior a todos os outros. Deveríamos tentar.

 
Sergey Chalyshev:

Naturalmente, eu faço. O problema é arrastar e soltar com o mouse. Se os objetos tiverem as mesmas coordenadas, uma está exatamente abaixo da outra. Quando você clica neles, qual deles reage?

De que clubes você está falando, não estou inscrito em nenhum clube e não tenho a intenção de ))

p.s. você pode me mostrar um exemplo?

Geralmente, em tal situação, o objeto que foi movido por último deve reagir - ele está no topo...

Razão: