Test de CGraphic - questions et suggestions - page 5

 
o_O:

- C'est difficile avec le zoomo. Comme il n'y a pas de barres de défilement. Et pour être honnête, je ne voudrais pas qu'ils soient mis en œuvre dans cette classe. Pour l'instant, il n'utilise que CCanvas, et ne demande pas d'autres objets. Et c'est très bien.

Je prévois d'implémenter le zoom indépendamment par héritage, de mettre des barres de défilement et de redimensionner selon les besoins.

Lesbarres de défilement sont diaboliques. Vous pouvez faire pivoter un graphique normal sans barres - avec la souris et le clavier.
 
fxsaber:
Les barres de défilement sont diaboliques. Vous pouvez faire tourner un graphique normal sans aucune barre - avec la souris et le clavier.

il n'y a pas d'événements graphiques pour le défilement, MQL ne les envoie pas.

Mais vous pouvez simplement glisser-déposer avec la souris au lieu de faire tourner la roue.

 
o_O:

mais vous pouvez simplement glisser-déposer avec la souris au lieu de faire tourner la roue.

Oui, c'est ainsi que je fais défiler et zoomer dans ZoomPrice.
 

@Roman Konopelko


Et le numéro 36?


Et j'ai trouvé une autre division par zéro

 

Je peux préciser (pour reproduire)

une courbe CurveAdd(arrY, CURVE_HISTOGRAM, "P/L") a été ajoutée ; elle possède un tableau arrY de taille 1 ou 0 éléments.

et à en juger par ce constructeur de courbe m_xmax=m_xmin=0.

 
o_O:

@Roman Konopelko

Et le numéro 36?
Et j'ai trouvé une autre division par zéro

Implémentation du #36 et correction de l'erreur de division par zéro.

La seule chose est que ValuesFunctionFormat n'a pas changé en :

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

Et implémenté des méthodes pour obtenir/réinitialiser un pointeur vers une fonction et un pointeur vers un objet pour celle-ci séparément :

   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;   }
Dossiers :
Axis.mqh  12 kb
Curve.mqh  21 kb
Graphic.mqh  86 kb
 

Veuillez corriger la gestion des couleurs dans les kanvas.

Maintenant, il ne prend pas en compte le canal alpha. La couleur au lieu de uint est partout.

De ce fait, lorsque l'on dessine sur la toile, il y a des trous de graphique partout (grilles et cadres transparents, car en couleur le canal alpha =0, c'est-à-dire complètement transparent).

Seulement dans certaines fonctions vous l'avez corrigé en appelant constamment ColorToARGB

par exemple

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));


Mais pourquoi ? Si vous voulez faire de la couleur un type uint et la définir avec un canal alpha...

Comme ici (et dans d'autres fonctions de couleur)

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.

Le fait que le canevas lui-même possède COLOR_FORMAT_XRGB_NOALPHA n'est pas important dans ce cas.

 

a décidé de vérifier les corrections dans la mise à jour 1502 du terminal

où sont apportées toutes les améliorations ?

Pas de ValuesFunctionFormat, pas de correction de bogues zerodevide

LOL

bonnes vacances )

 

installé 1510.

ValuesFunctionFormat est là, c'est OK.

--

@Roman Konopelko voir la phrase s'il vous plaît.

Dans le code CGraphic, il s'agit juste de quelques variables et fonctions. La substitution n'est pas difficile.

Mais cela supprime le problème de la transparence dans le rendu. Parce qu'en couleur, le canal alpha = 100 % de transparence, ce qui est faux.

 
o_O:

@Roman Konopelko voir la phrase s'il vous plaît.

Il n'y a que quelques variables et fonctions dans le code CGraphic. La substitution n'est pas difficile.

Mais cela supprime le problème de la transparence lors du rendu. En fait, en couleur, canal alpha = 100% de transparence, ce qui est faux.

Dans la classe CGraphic, j'ai remplacé le type de couleur par uint à tous les endroits, comme vous l'avez suggéré.

J'ai également ajouté de nouvelles méthodes dans la classe CCanvas, qui permettent de dessiner des primitives avec une épaisseur donnée :
   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);
Dans la lignée de l'innovation de CCanvas, j'ai étendu les propriétés 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;         }
Vous pouvez désormais spécifier l'épaisseur des lignes et le style de leurs extrémités lorsque vous dessinez une courbe avec des lignes.

Exemple :
#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();
  }
Résultat :


L'implémentation de ces méthodes est basée sur l'algorithme Fast Prefiltered Lines, dans lequel le degré de lissage des lignes est basé sur le filtre sélectionné. Si nécessaire, je la décrirai plus en détail.
Dossiers :
Canvas.mqh  144 kb
Axis.mqh  12 kb
Curve.mqh  22 kb
Graphic.mqh  86 kb
Raison: