Prueba CGraphic - preguntas y sugerencias - página 5

 
o_O:

- Es difícil con zoomo. Como no hay barras de desplazamiento. Y para ser honesto, no me gustaría que se implementaran en esta clase. Ahora mismo sólo utiliza CCanvas, y no pide otros objetos. Y esto es muy bueno.

Tengo pensado implementar el zoom de forma independiente por herencia, poner barras de desplazamiento y reescalar cuando sea necesario.

Las barras de desplazamiento son malas. Puede girar un gráfico normal sin barras, con el ratón y el teclado.
 
fxsaber:
Las barras de desplazamiento son malas. Puede hacer girar un gráfico normal sin barras, con el ratón y el teclado.

no hay eventos de gráfico para el desplazamiento. MQL no los envía.

Pero puedes simplemente arrastrar y soltar con el ratón en lugar de girar la rueda.

 
o_O:

pero puedes simplemente arrastrar y soltar con el ratón en lugar de girar la rueda.

Sí, así es como me desplazo y hago zoom en ZoomPrice.
 

@Roman Konopelko


¿Y el número 36?


Y encontró otra división en cero

 

Puedo aclarar (para reproducir)

se ha añadido una curva CurveAdd(arrY, CURVE_HISTOGRAM, "P/L"); tiene un array arrY de tamaño 1 o 0 elementos.

y a juzgar por este constructor de curvas m_xmax=m_xmin=0.

 
o_O:

@Roman Konopelko

¿Y el número 36?
Y encontró otra división en cero

Implementado #36 y corregido el error de división a cero.

Lo único es que ValuesFunctionFormat no ha cambiado a:

void              ValuesFunctionFormat(DoubleToStringFunction func, void* cbdata) { m_values_func=func; m_cbdata=cbdata; }

E implementado métodos para obtener/establecer un puntero a una función y un puntero a un objeto para ello por separado:

   DoubleToStringFunction ValuesFunctionFormat(void)    const { return(m_values_func);    }
   void              ValuesFunctionFormat(DoubleToStringFunction func) { m_values_func=func; }
   void             *ValuesFunctionFormatCBData(void)   const { return(m_values_cbdata);  }
   void              ValuesFunctionFormatCBData(void *cbdata) { m_values_cbdata=cbdata;   }
Archivos adjuntos:
Axis.mqh  12 kb
Curve.mqh  21 kb
Graphic.mqh  86 kb
 

Por favor, arregla el manejo de colores en kanvas.

Ahora no tiene en cuenta el canal alfa. color en lugar de uint está en todas partes.

Debido a esto, al dibujar en el lienzo, hay huecos de gráfico en todas partes (rejillas y marcos transparentes, porque en color el canal alfa =0, es decir, completamente transparente)

Sólo que en algunas funciones lo arreglaste llamando constantemente a ColorToARGB

Por ejemplo

void CGraphic::CreateBackground(void)
  {
...
//--- create background
   m_canvas.FillRectangle(0,0,m_width,m_up-1,ColorToARGB(m_background.clr,255));
   m_canvas.FillRectangle(0,m_height-m_down+1,m_width,m_height,ColorToARGB(m_background.clr,255));
   m_canvas.FillRectangle(0,m_up,m_left-1,m_height-m_down,ColorToARGB(m_background.clr,255));
   m_canvas.FillRectangle(m_width-m_right+1,m_up,m_width,m_height-m_down,ColorToARGB(m_background.clr,255));


Pero, ¿por qué? si quieres hacer que el color sea de tipo uint y establecerlo con el canal alfa

Como aquí (y en otras funciones de color)

void CGraphic::SetDefaultParameters(void)
  {
...
//--- sets the default values for grid
   m_grid.clr_line=ColorToARGB(clrWhiteSmoke);
   m_grid.clr_axis_line=ColorToARGB(clrSilver);
   m_grid.clr_frame=ColorToARGB(clrBlack);
   m_grid.clr_background=ColorToARGB(clrWhite);

----

PS.

El hecho de que el propio lienzo tenga COLOR_FORMAT_XRGB_NOALPHA no es importante en este caso.

 

decidió comprobar las correcciones en la actualización del terminal 1502

¿dónde se han hecho todas las mejoras?

No hay ValuesFunctionFormat, ni correcciones de errores zerodevide

LOL

felices fiestas )

 

instalado 1510.

ValuesFunctionFormat está ahí, está bien.

--

@Roman Konopelko vea la frase por favor.

En el código CGraphic son sólo algunas variables y funciones. La sustitución no es difícil.

Pero elimina el problema de la transparencia en el renderizado. Porque en color el canal alfa =100% de transparencia, lo cual es incorrecto.

 
o_O:

@Roman Konopelko vea la frase por favor.

En el código de CGraphic sólo hay unas pocas variables y funciones. La sustitución no es difícil.

Pero elimina el problema de la transparencia al renderizar. De hecho, en color el canal alfa = 100% de transparencia, lo cual es incorrecto.

En la clase CGraphic he sustituido el tipo de color por uint en todos los lugares, tal y como has sugerido.

También he añadido nuevos métodos en la clase CCanvas, que permiten dibujar primitivas con un grosor determinado:
   void              LineThickVertical(const int x,const int y1,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              LineThickHorizontal(const int x1,const int x2,const int y,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              LineThick(const int x1,const int y1,const int x2,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              PolylineThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              PolygonThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
En línea con la innovación de CCanvas, he ampliado las propiedades de CCurve:
   ENUM_LINE_END     LinesEndStyle(void)                      const { return(m_lines_end_style); }
   int               LinesWidth(void)                         const { return(m_lines_width);     }
   void              LinesEndStyle(ENUM_LINE_END end_style)   { m_lines_end_style=end_style; }
   void              LinesWidth(const int width)              { m_lines_width=width;         }
Ahora puede especificar el grosor de las líneas y el estilo de sus extremos al dibujar una curva con líneas.

Ejemplo:
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 };
   double y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 };
   CGraphic graphic;
   graphic.Create(0,"G",0,30,30,780,380);
//--- plot curve
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.LinesSmooth(true);
   curve.LinesStyle(STYLE_DOT);
   curve.LinesEndStyle(LINE_END_ROUND);
   curve.LinesWidth(10);
   graphic.CurvePlotAll();
   graphic.Update();
  }
Resultado:


La aplicación de estos métodos se basa en el algoritmo Fast Prefiltered Lines, en el que el grado de suavidad de las líneas se basa en el filtro seleccionado. Si es necesario, lo describiré con más detalle.
Archivos adjuntos:
Canvas.mqh  144 kb
Axis.mqh  12 kb
Curve.mqh  22 kb
Graphic.mqh  86 kb