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の 代わりにcolorが いたるところにあります。

このため、キャンバスに描画すると、いたるところにチャートの隙間ができてしまいます(カラーではアルファチャンネル=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型にして アルファチャンネルを設定したい場合です。

ここでも(他のカラー機能でも)そうですが

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があればOKです。

--

Roman Konopelko さん、 文章をご覧ください。

CGraphicのコードでは、いくつかの変数と関数に過ぎません。代用は難しくありません。

しかし、レンダリング時の透明度の問題は解消されます。カラーではアルファチャンネル=100%の透明度なので、これは間違いです。

 
o_O:

Roman Konopelko さん、 文章をご覧ください。

CGraphicのコードには、変数と関数がわずかしかありません。代用は難しくありません。

しかし、レンダリング時の透明度の問題は解消されます。実は、カラーではアルファチャンネル=透明度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();
  }
結果


これらの方法の実装は、選択されたフィルターに基づいて線の滑らかさの程度を決定するFast Prefiltered Lines アルゴリズムに基づくものである。必要であれば、さらに詳しく説明します。
ファイル:
Canvas.mqh  144 kb
Axis.mqh  12 kb
Curve.mqh  22 kb
Graphic.mqh  86 kb