Bibliotecas: Easy Canvas - página 4

 
Excelente. Prático e fácil de entender.
 

Sugiro adicionar o status do botão do mouse. Isso não afetará a velocidade, mas pode ser útil)


struct Window
  {
   long              ChartId;     // identificador da janela atual
   uint              Color;       // cor de fundo da janela
   int               Width;       // largura da janela
   int               Height;      // altura da janela
   int               height[];    // altura das subjanelas
   int               Left_bar;    // número da barra mais à esquerda na janela
   double            Right_bar;   // número da barra mais à direita na janela
   double            Total_bars;  // o número máximo de barras na janela
   int               BarsInWind;  // número de barras visíveis na janela
   double            Y_min;       // O valor mínimo do preço na janela
   double            Y_max;       // O valor máximo do preço na janela
   double            dy_pix;      // mudança de preço para um pixel
   int               dx_pix;      // alteração do número de barras por pixel
   int               MouseX;      // coordenada X da posição atual do ponteiro do mouse
   int               MouseY;      // coordenada Y da posição atual do ponteiro do mouse
   int               MouseStatus; // status dos botões do mouse
   double            MouseBar;    // a posição atual da barra do ponteiro do mouse 
   double            MousePrice;  // o preço atual do ponteiro do mouse
   datetime          MouseTime;   // a hora atual do ponteiro do mouse
   int               MouseSubWin; // número da subjanela na qual o ponteiro do mouse está localizado
   int               WindowsTotal;// total de subjanelas, incluindo a janela principal
   int               SubWin;      // subjanela atual
   datetime          time[];      // matriz do horário de abertura de todas as barras visíveis na janela
  };


void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseStatus=(int)sparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
 
Oleksii Chepurnyi:

Sugiro adicionar o status do botão do mouse. Isso não afetará a velocidade, mas pode ser útil)

Não posso concordar, pois não vejo muito sentido nisso.

A questão é que o status dos botões e das teclas do mouse é um modelo de evento, que deve ser processado somente onde a ocorrência desse evento é capturada, ou seja, em OnChartEvent.
Você não vai limitar um loop infinito de sondagem da ocorrência de algum evento fora do manipulador de eventos. Então, qual é o sentido de colocar esse status fora de OnChartEvent, quando todo o processamento desses cliques deve ser feito em OnChartEvent, cujo status está em lparam e sparam.

Exceto pelo propósito de introduzir uma nova estrutura de identificadores de eventos de mouse para melhorar a legibilidade do código.

 
Nikolai Semko:

Não posso concordar, pois não vejo muito sentido nisso.

A questão é que o status dos botões e das teclas do mouse é um modelo de evento, que deve ser tratado somente onde a ocorrência desse evento é capturada, ou seja, em OnChartEvent.
Você não vai limitar um loop infinito de sondagem da ocorrência de algum evento fora do manipulador de eventos. Então, qual é o sentido de colocar esse status fora de OnChartEvent, quando todo o processamento desses cliques deve ser feito em OnChartEvent, cujo status está em lparam e sparam.

Exceto pelo propósito de introduzir uma nova estrutura de identificadores de eventos de mouse para melhorar a legibilidade do código.

E por que armazenar as coordenadas do mouse, então? ) Também orientado por eventos )

Eu não entendi sobre o loop...

Em particular, eu precisava do status para evitar desenhar uma parte do objeto ao arrastar com o mouse.

 
Oleksii Chepurnyi:

Então, por que armazenar as coordenadas do mouse? ) Também orientado por eventos )

As coordenadas do mouse são uma questão diferente. As coordenadas atuais do mouse não são informações de evento. O evento é a sua alteração.

Pode haver momentos em que as coordenadas do mouse sejam necessárias fora do OnChartEvent. Por exemplo, aqui.

Oleksii Chepurnyi:

Não entendi sobre o loop...

Em particular, o status era necessário para evitar o desenho de uma parte do objeto ao arrastá-lo com o mouse.

Bem, ao arrastar o mouse, o comando para redesenhar parte do objeto é chamado a partir do OnChartEvent no momento em que a coordenada do mouse muda e enquanto o mouse é pressionado, e o OnChartEvent tem esse status, por que incorporá-lo à estrutura do Window?

Se você fizesse a mesma coisa sem ser em OnChartEvent e, ao mesmo tempo, na instância W da estrutura Window houvesse MouseStatus, você teria que organizar um loop infinito de sondagem desse parâmetro (MouseStatus) para capturar o momento de soltar o botão do mouse, o que travaria a CPU.

Esse loop não é necessário apenas em OnChartEvent.

Quero apenas dizer que você pode e deve usar o status do botão somente em OnChartEvent, onde ele já está presente.

Se eu estiver errado, forneça um exemplo concreto em que esse status seria necessário não em OnChartEvent.


 
Nikolai Semko:

Se eu estiver errado, forneça um exemplo concreto em que esse status seria exigido de algo diferente de OnChartEvent.

Escrevi um exemplo acima e tudo funciona bem.)

Em OnChartEvent, ao mover o mouse, alteramos os parâmetros e damos o comando para redesenhar a tela. Sem um parâmetro na estrutura, teríamos que passar sparam para um objeto, de lá para outro objeto, e de lá para o método Draw().

 
Nikolai Semko:

As coordenadas do mouse são uma questão diferente. As coordenadas atuais do mouse não são informações do evento. O evento é sua alteração.

Pode haver momentos em que as coordenadas do mouse sejam necessárias fora do OnChartEvent. Por exemplo, aqui.

Bem, ao arrastar o mouse, o comando para redesenhar parte do objeto é chamado de OnChartEvent no momento em que a coordenada do mouse muda e enquanto o botão do mouse está pressionado, e OnChartEvent tem esse status, por que incorporá-lo à estrutura Window?

Se você fizesse a mesma coisa não a partir de OnChartEvent e, ao mesmo tempo, na instância W da estrutura Window houvesse MouseStatus, você teria que organizar um loop infinito de sondagem desse parâmetro (MouseStatus) para capturar o momento de soltar o botão do mouse, o que travaria a CPU.

Esse loop não é necessário apenas em OnChartEvent.

Quero apenas dizer que você pode e deve usar o status do botão somente em OnChartEvent, que já o possui.

Se eu estiver errado, dê-me um exemplo concreto em que esse status seria necessário não em OnChartEvent.


Raciocínio muito estranho. Não há lógica alguma.

Tanto as coordenadas do mouse quanto as teclas pressionadas são estados externos. Ele é passado por meio de parâmetros para o manipulador, onde, se for colocado nas variáveis internas do objeto (o que certamente é útil), deverá estar lá como um todo, não em partes. Uma biblioteca é, por definição, algo que não é feito para as próprias necessidades, mas de forma generalizada, levando em conta as possíveis necessidades de outras pessoas. Não é possível conhecer todas as necessidades com antecedência, portanto, não se deve criar restrições artificiais como essa.

 
Oleksii Chepurnyi:

Escrevi um exemplo acima e tudo funciona bem.)

Em OnChartEvent, ao mover o mouse, alteramos os parâmetros e damos o comando para redesenhar a tela. Sem um parâmetro na estrutura, teríamos que passar sparam para um objeto, daí para outro objeto e daí para o método Draw().

Esse é um clássico do gênero - em todas as bibliotecas de janelas, os estados dos botões do mouse são passados em uma única estrutura com as coordenadas do cursor.

porque todos eles juntos descrevem uma entidade e não podem ser separados.

 
Está bem. Você entendeu.
 

atualizado para a versão 1.29

Novo:

1. Adicionadas as seguintes definições para simplificar a escrita do código e melhorar a legibilidade:

#define _Comment Canvas.Comm
#define _X Canvas.X
#define _Y Canvas.Y
#define _TimePos Canvas.TimePos
#define _Bar Canvas.Bar
#define _Price Canvas.Price
#define _CommXY(x,y,str) Canvas.TextPosition(x,y);\
Canvas.Comm(str);
#define _Font Canvas.CurentFont
#define _PixelSet Canvas.PixelSet
#define _MouseX W.MouseX
#define _MouseY W.MouseY
#define _MouseBar W.MouseBar
#define _Width W.Width
#define _Height W.Height
#define _Left_bar W.Left_bar
#define _Right_bar W.Right_bar
#define _BarsInWind W.BarsInWind

2. Adicionado o parâmetro MouseStatus à estrutura Window, que pode assumir 4 valores, conforme solicitado pelos trabalhadores:

  • NO_PRESSED (0)
  • LEFT_BUTTON_PRESSED (1)
  • BOTÃO_DIREITO_PRESSIONADO (2)
  • LEFT_AND_RIGHT_BUTTONS_PRESSED (3)