ライブラリ: イージーキャンバス - ページ 4

 
スーパー。便利でわかりやすい。
 

マウスボタンのステータスを追加することをお勧めする。スピードには影響しないが、役に立つだろう )


struct Window
  {
   long              ChartId;     // 現在のウィンドウ識別子
   uint              Color;       // ウィンドウの背景色
   int               Width;       // ウィンドウの幅
   int               Height;      // ウィンドウの高さ
   int               height[];    // サブウィンドウの高さ
   int               Left_bar;    // ウィンドウの一番左のバーの番号
   double            Right_bar;   // ウィンドウの一番右のバーの数
   double            Total_bars;  // ウィンドウ内のバーの最大数
   int               BarsInWind;  // ウィンドウに表示されているバーの数
   double            Y_min;       // ウィンドウ内の価格の最小値
   double            Y_max;       // ウィンドウ内の価格の最大値
   double            dy_pix;      // 1ピクセルの価格変動
   int               dx_pix;      // ピクセルあたりのバーの数を変更する
   int               MouseX;      // マウスポインタの現在位置の座標X
   int               MouseY;      // マウスポインタの現在位置の座標Y
   int               MouseStatus; // マウスボタンの状態
   double            MouseBar;    // マウスポインタの現在のバー位置 
   double            MousePrice;  // マウスポインタの現在価格
   datetime          MouseTime;   // マウスポインタの現在時刻
   int               MouseSubWin; // マウスポインタがあるサブウィンドウの番号。
   int               WindowsTotal;// メイン・ウィンドウを含むサブウィンドウの合計
   int               SubWin;      // 現在のサブウィンドウ
   datetime          time[];      // ウィンドウ内のすべての可視バーのオープン時間の配列
  };


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:

マウスボタンのステータスを追加することをお勧めする。スピードには影響しないが、役に立つだろう )

あまり意味があるとは思えないので、賛成できない。

ポイントは、マウスボタンとキーのステータスはイベントモデルであり、このイベントの発生がキャッチされる場所、すなわちOnChartEventでのみ処理されるべきであるということです。
イベント・ハンドラの外でイベントの発生をポーリングする無限ループを制限するつもりはないだろう。したがって、これらのクリックの処理はすべてOnChartEvent内で行われるべきで、そのステータスはlparamとsparamにあるはずなのに、このステータスをOnChartEventの外に置くことに何の意味があるのでしょうか。

ただし、コードの可読性を向上さ せるために、マウス・イベント識別子の新しい構造を導入するという目的は別である。

 
Nikolai Semko:

あまり意味がないと思うので、賛成できない。

重要なのは、マウス・ボタンやキーの状態はイベント・モデルであり、このイベントの発生がキャッチされる場所、つまりOnChartEventでのみ処理されるべきであるということだ。
イベント・ハンドラの外でイベントの発生をポーリングする無限ループを制限するつもりはないだろう。では、このステータスをOnChartEventの外に置くことに何の意味があるのでしょうか?これらのクリックの処理はすべてOnChartEventで行われるべきで、そのステータスはlparamとsparamにあります。

ただし、コードの可読性を向上さ せるために、マウス・イベント識別子の新しい構造を導入するという目的は別である。

そして、なぜマウス座標を保存するのでしょうか?) また、イベントドリブン )

ループについては理解していませんでした...。

特に、マウスでドラッグしたときにオブジェクトの一部が描画されないようにするためにステータスが必要でした。

 
Oleksii Chepurnyi:

なぜマウス座標を保存するのか?) また、イベントドリブン )

マウス座標は別問題です。現在のマウス座標はイベント情報ではない。イベントはその変化です。

OnChartEventの外でマウス座標が必要になることがあるかもしれない。例えばここ だ。

Oleksii Chepurnyi

ループについて理解していませんでした...。

特に、マウスでドラッグしたときにオブジェクトの一部を描画しないステータスが必要でした。

マウスをドラッグしているとき、オブジェクトの一部を再描画するコマンドは、マウスの座標が変化した瞬間とマウスが押されている間にOnChartEventから呼び出され、OnChartEventはこのステータスを持っています。

同じことをOnChartEventからでなく、同時にWindow 構造体のインスタンスWにMouseStatusがあるとすると、マウスボタンを離した瞬間を捕らえるために、このパラメータ(MouseStatus)のポーリングの無限ループを組織しなければならず、CPUがハングアップしてしまいます。

このループはOnChartEventの中だけで必要なものではない。

私が言いたいのは、ボタン・ステータスはOnChartEventからしか使えないし、使うべきでないということだ。

もし間違っていたら、このステータスがOnChartEventからでなくても 必要な具体例を教えてください。


 
Nikolai Semko:

もし間違っているなら、このステータスがOnChartEvent以外から 要求される具体的な例を示してほしい。

上に例を書きましたが、すべて問題なく動作しています。)

OnChartEventでは、マウスを動かしたときにパラメータを変更し、キャンバスを再描画するコマンドを与えます。構造体にパラメータがなければ、sparamをオブジェクトに渡し、そこから別のオブジェクトに渡し、そこからDraw()メソッドに渡す必要がある。

 
Nikolai Semko:

マウス座標は別問題だ。現在のマウス座標はイベント情報ではない。イベントはその変化である。

OnChartEventの外でマウス座標が必要とされる場合があるかもしれない。例えばここ だ。

さて、マウスをドラッグして、マウス座標が変化した瞬間と、マウスボタンが押されている間に、OnChartEventからオブジェクトの一部を再描画するコマンドが呼び出されるのだが、OnChartEventはこのステータスを持っているのに、なぜWindow構造体に埋め込むのか?

同じことをOnChartEventからではなく、同時にWindow 構造体のインスタンスWにMouseStatusがあるとすると、マウスボタンを離した瞬間を捕らえるために、このパラメータ(MouseStatus)のポーリングの無限ループを組織しなければならず、CPUがハングアップしてしまう。

このループは OnChartEvent でのみ必要ではない。

ボタン・ステータスはOnChartEventからのみ使用可能で、OnChartEventはすでにボタン・ステータスを持っている。

もし私が間違っているなら、このステータスがOnChartEventからでなくても 必要な具体例を教えてください。


非常に奇妙な推論だ。ロジックがまったくない。

マウス座標も押されたキーも外部状態である。それはパラメーターを通してハンドラーに渡され、オブジェクトの内部変数に入れられるのであれば(それは確かに便利だが)、部分的ではなく全体としてそこにあるべきだ。ライブラリとは定義上、自分自身のニーズのために作られたものではなく、他の人の潜在的なニーズを考慮して一般化された形で作られたものである。すべてのニーズを事前に知ることはできないのだから、このような人為的な制限を設けないだけだ。

 
Oleksii Chepurnyi:

上に例を書きましたが、すべてうまくいきました )

OnChartEventでマウスを動かしたときにパラメータを変更し、キャンバスを再描画するコマンドを与えます。構造体にパラメータがなければ、sparamをオブジェクトに渡し、そこから別のオブジェクトに渡し、そこからDraw()メソッドに渡す必要がある。

これはこのジャンルの典型的な例で、すべてのウィンドウ・ライブラリでは、マウス・ボタンの状態はカーソル座標と一緒に1つの構造体で渡されます。

、これらはすべて一緒になって1つの実体を記述しており、別々にすることはまったくできないからです。

 
オーケー。わかったね。
 

バージョン1.29に更新

新しい

1. コード記述の簡素化と可読性の向上の ため、以下の定義を追加:

#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. Window 構造体に MouseStatus パラメータを追加。ワーカーが要求する 4 つの値を取ることができます:

  • NO_PRESSED (0)
  • left_button_pressed (1)
  • 右ボタンが押された (2)
  • 左と右のボタンが押された (3)