Librerías: Easy Canvas - página 4

 
Estupendo. Cómodo y fácil de entender.
 

Sugiero añadir el estado de los botones del ratón. No afectará a la velocidad, pero puede ser útil )


struct Window
  {
   long              ChartId;     // identificador de la ventana actual
   uint              Color;       // color de fondo de la ventana
   int               Width;       // anchura de la ventana
   int               Height;      // altura de la ventana
   int               height[];    // altura sub_windows
   int               Left_bar;    // número de la barra más a la izquierda de la ventana
   double            Right_bar;   // número de la barra más a la derecha de la ventana
   double            Total_bars;  // el número máximo de barras en la ventana
   int               BarsInWind;  // número de barras visibles en la ventana
   double            Y_min;       // El valor mínimo del precio en la ventana
   double            Y_max;       // El valor máximo del precio en la ventana
   double            dy_pix;      // cambio de precio de un píxel
   int               dx_pix;      // cambiar el número de barras por píxel
   int               MouseX;      // coordenada X de la posición actual del puntero del ratón
   int               MouseY;      // coordenada Y de la posición actual del puntero del ratón
   int               MouseStatus; // estado de los botones del ratón
   double            MouseBar;    // la posición actual de la barra del puntero del ratón 
   double            MousePrice;  // el precio actual del puntero del ratón
   datetime          MouseTime;   // la hora actual del puntero del ratón
   int               MouseSubWin; // número de la subventana en la que se encuentra el puntero del ratón
   int               WindowsTotal;// total de subventanas, incluida la ventana principal
   int               SubWin;      // subventana actual
   datetime          time[];      // array de la hora de apertura de todas las barras visibles en la ventana
  };


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:

Sugiero añadir el estado de los botones del ratón. No afectará a la velocidad, pero puede ser útil )

No puedo estar de acuerdo, ya que no le veo mucho sentido.

La cuestión es que el estado de los botones y teclas del ratón es un modelo de evento, que debe ser procesado sólo donde se captura la ocurrencia de este evento, es decir, en OnChartEvent.
Usted no va a limitar un bucle infinito de sondeo de la ocurrencia de algún evento fuera del controlador de eventos. Entonces, ¿cuál es el punto de poner este estado fuera de OnChartEvent, cuando todo el procesamiento de estos clics se debe hacer en OnChartEvent, cuyo estado está en lparam y sparam.

Excepto con el propósito de introducir una nueva estructura de identificadores de eventos de ratón para mejorar la legibilidad del código.

 
Nikolai Semko:

No puedo estar de acuerdo ya que no le veo mucho sentido.

El punto es que el estado de los botones y teclas del ratón es un modelo de evento, que debe ser manejado sólo donde la ocurrencia de este evento es capturado, a saber, en OnChartEvent.
Usted no va a limitar un bucle infinito de sondeo de la ocurrencia de algún evento fuera del controlador de eventos. Entonces, ¿cuál es el punto de poner este estado fuera de OnChartEvent, cuando todo el procesamiento de estos clics se debe hacer en OnChartEvent, cuyo estado está en lparam y sparam.

Excepto con el propósito de introducir una nueva estructura de identificadores de eventos de ratón para mejorar la legibilidad del código.

¿Y por qué almacenar las coordenadas del ratón entonces? ) También dirigido por eventos )

No entendí lo del bucle...

En particular, necesitaba el estado para evitar dibujar una parte del objeto al arrastrar con el ratón.

 
Oleksii Chepurnyi:

¿Por qué almacenar entonces las coordenadas del ratón? ) También dirigido por eventos )

Las coordenadas del ratón son un asunto diferente. Las coordenadas actuales del ratón no son información de evento. El evento es su cambio.

Puede haber ocasiones en las que las coordenadas del ratón sean necesarias fuera de OnChartEvent. Por ejemplo, aquí.

Oleksii Chepurnyi:

No entendí lo del bucle...

En concreto, el estado era necesario para evitar dibujar una parte del objeto al arrastrar con el ratón.

Pues bien, al arrastrar el ratón, la orden de redibujar parte del objeto se llama desde OnChartEvent en el momento en que cambia la coordenada del ratón y mientras el ratón está pulsado, y OnChartEvent tiene este estado, ¿por qué incrustarlo en la estructura Window?

Si hicieras lo mismo no desde OnChartEvent, y al mismo tiempo en la instancia W de la estructura Window estuviera MouseStatus, tendrías que organizar un bucle infinito de sondeo de este parámetro (MouseStatus) para captar el momento de soltar el botón del ratón, lo que colgaría la CPU.

Este bucle no es necesario sólo en OnChartEvent.

Sólo quiero decir que es posible y necesario utilizar el estado del botón sólo desde OnChartEvent, que ya lo tiene.

Si estoy equivocado, por favor dame un ejemplo concreto en el que este estado sería necesario no desde OnChartEvent.


 
Nikolai Semko:

Si me equivoco, por favor proporcione un ejemplo concreto en el que este estado se solicite desde algo distinto de OnChartEvent.

Escribí un ejemplo arriba, todo funciona bien )

En OnChartEvent al mover el ratón cambiamos los parámetros y damos la orden de redibujar el lienzo. Sin un parámetro en la estructura tendríamos que pasar sparam a un objeto, de ahí a otro objeto, y de ahí al método Draw().

 
Nikolai Semko:

Las coordenadas del ratón son un asunto diferente. Las coordenadas actuales del ratón no son información del evento. El evento es su cambio.

Puede haber ocasiones en las que las coordenadas del ratón sean necesarias fuera de OnChartEvent. Por ejemplo, aquí.

Pues bien, al arrastrar el ratón, la orden de redibujar parte del objeto se llama desde OnChartEvent en el momento en que cambia la coordenada del ratón y mientras el botón del ratón está pulsado, y OnChartEvent tiene este estado, ¿por qué incrustarlo en la estructura Window?

Si hicieras lo mismo no desde OnChartEvent, y al mismo tiempo en la instancia W de la estructura Window estuviera MouseStatus, tendrías que organizar un bucle infinito de sondeo de este parámetro (MouseStatus) para captar el momento de soltar el botón del ratón, lo que colgaría la CPU.

Este bucle no es necesario sólo en OnChartEvent.

Sólo quiero decir que puedes y debes usar el estado del botón sólo desde OnChartEvent, que ya lo tiene.

Si estoy equivocado, entonces dame un ejemplo concreto en el que este estado sería necesario no desde OnChartEvent.


Muy extraño razonamiento. No hay ninguna lógica.

Tanto las coordenadas del ratón como las teclas pulsadas son estados externos. Se pasa a través de parámetros al manejador, donde si se pone en las variables internas del objeto (lo cual es ciertamente útil), debería estar allí como un todo, no por partes. Una biblioteca es, por definición, algo que se hace no para las necesidades propias, sino de forma generalizada, teniendo en cuenta las posibles necesidades de los demás. No se pueden conocer todas las necesidades de antemano, así que no se hacen restricciones artificiales como ésta.

 
Oleksii Chepurnyi:

Escribí un ejemplo arriba, todo funciona bien )

En OnChartEvent al mover el ratón cambiamos los parámetros y damos la orden de redibujar el lienzo. Sin un parámetro en la estructura tendríamos que pasar sparam a un objeto, de ahí a otro objeto, y de ahí al método Draw().

Esto es un clásico del género - en todas las librerías de ventanas, los estados de los botones del ratón se pasan en una única estructura con las coordenadas del cursor.

porque todos juntos describen una entidad y no pueden estar separados en absoluto.

 
De acuerdo. Entendido.
 

actualizado a la versión 1.29

nuevo:

1. añadido las siguientes definiciones para simplificar la escritura de código y mejorar la legibilidad:

#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. añadido el parámetro MouseStatus a la estructura Window, que puede tomar 4 valores, según lo solicitado por los trabajadores:

  • NO_PRESIONADO (0)
  • BOTÓN_IZQUIERDO_PRESIONADO (1)
  • BOTÓN_DERECHO_PULSADO (2)
  • BOTÓN_IZQUIERDO_Y_DERECHO_PRESIONADOS (3)