测试CGraphic--问题和建议 - 页 5

 
o_O:

- 使用zoomo很困难。因为没有滚动条。而且说实话,我也不希望他们在这个班上实施。现在它只使用CCanvas,而不要求其他对象。而这是非常好的。

我计划通过继承独立实现缩放,放上滚动条,并根据需要重新缩放。

滚动条 是邪恶的。你可以用鼠标和键盘来旋转一个没有任何条形的普通图表。
 
fxsaber:
滚动条是邪恶的。你可以用鼠标和键盘旋转一个没有任何条形的普通图表。

没有用于滚动的图表事件。 MQL不发送它们。

但你可以简单地用鼠标拖动,而不是旋转转盘。

 
o_O:

但你可以简单地用鼠标拖动,而不是旋转转盘。

是的,这就是我在ZoomPrice中滚动和缩放的方式。
 

@罗曼-科诺佩尔科


36号 呢?


并发现另一个零除法

 

我可以澄清一下(重现)

添加了一条CurveAdd(arrY, CURVE_HISTOGRAM, "P/L")曲线;它有一个大小为1或0元素的ArrY阵列。

而从这个曲线构造器来看,m_xmax=m_xmin=0。

 
o_O:

@罗曼-科诺佩尔科

36号 呢?
并发现另一个零除法

实施了#36,修正了除零错误。

唯一的一点是,ValuesFunctionFormat没有改变为。

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

并实现了分别为其获取/设置一个函数的指针和一个对象的指针的方法。

   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;   }
附加的文件:
Axis.mqh  12 kb
Curve.mqh  21 kb
Graphic.mqh  86 kb
 

请修复kanvas中的颜色处理问题。

现在它不考虑阿尔法通道了。颜色 而不是uint 到处都是。

正因为如此,当在画布上绘图时,到处都有图表的间隙(透明的网格和框架,因为在颜色中,alpha通道=0,即完全透明)。

只是在一些函数中,你通过不断调用ColorToARGB来解决这个问题

比如说

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


如果你想让颜色成为一个uint 类型,并且 用alpha通道来设置它,那么为什么?

如这里(以及其他颜色的功能)

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。

在这种情况下,画布本身的COLOR_FORMAT_XRGB_NOALPHA并不重要。

 

决定检查终端更新1502中的修复措施

所有的改进都是在哪里进行的?

没有ValuesFunctionFormat,没有修复错误的zerodevide

大笑

节日快乐 )

 

安装了1510。

ValuesFunctionFormat在那里,它是确定的。

--

@罗曼-科诺佩尔科 请看 句。

在CGraphic代码中,它只是一些变量和函数。替换并不困难。

但它消除了渲染中的透明度问题。因为在颜色中alpha通道=100%的透明度,这是错误的。

 
o_O:

@罗曼-科诺佩尔科 请看 句。

CGraphic代码中只有几个变量和函数。替换并不困难。

但它消除了渲染时的透明度问题。事实上,在颜色中alpha通道=100%的透明度,这是错误的。

在CGraphic类中,我已经按照你的建议,在所有地方用uint替换了颜色类型。

我还在 CCanvas 类中添加了新的方法,这些方法允许以给定的厚度绘制基元。
   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);
为了与CCanvas的创新保持一致,我扩展了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;         }
现在你可以在用线条绘制曲线时指定线条的粗细和其末端的样式。

例子。
#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();
  }
结果。


这些方法的实现是基于快速预滤波线的 算法,其中线的平滑程度是基于所选择的过滤器。如果有必要,我将更详细地描述它。
附加的文件:
Canvas.mqh  144 kb
Axis.mqh  12 kb
Curve.mqh  22 kb
Graphic.mqh  86 kb