キャンバスがカッコいい! - ページ 44

 
Nikolai Semko:

これらの機能は、恐ろしく出来が悪い。とんでもないことなんです。正常なアンチエイリアスも、混色や透明度の正常な処理もない。それをクシャクシャにしてゴミ箱に捨て、新しいものを書けばいいのです。
以前、ここでも 書いたことがあります。

いずれにせよ、標準のPixelTransform関数をこの関数に置き換えることは間違いないでしょう。

https://www.mql5.com/ru/forum/1111/page2553#comment_13054823

私のダブルバージョン(intの入力パラメータがすべてdoubleになる)を書き始めたのですが、完成せず棚上げにしました。一見シンプルに見えるが、それほど簡単な作業ではない。まあ、正確に書くことが問題なのではなく、アルゴリズムを高速化するために、非常に高いクオリティで書くことが問題なのですが。私の一番の悩みはパーフェクショニズム(完璧主義)です。

なるほど、まだ完成していないのか)

キャンバス全体を書き直そうという気にはなりそうもない。とりあえず2画素1枚ではなく、1画素2枚を並べて描かないといけないですね )

 
Andrey Khatimlianskii:

なるほど、完成していなかったんですね(笑)。

キャンバスを全部書き直そうという気にはなりそうもない。2画素のものを1つ描くのではなく、1画素のものを2つ並べて描くしかないですね(笑)。

キャンバス全体を書き換える必要はありません。メインはサークル形式

Circle(double x, double y, double r1, double r2=0, uint clr)  

を表示し、線を正常にする。

Polyline(const double &x[],const double &y[], const uint clr,const double size,const uint style,ENUM_LINE_END end_style)

これで95%はカバーできるはず

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

すべてのオブジェクトを1つのオブジェクトに変換する方法

ニコライ・セムコ 2019.10.05 22:39

確かに、Canvasはソリューションです。

そして、Canvasは一見したところ、とても簡単です。

ここでは、1つのオブジェクトOBJ_BITMAP_LABELを持つインジケータ(MQL5 & MQL4)の原始的な例で、多くのウィンドウが存在するものを紹介します。

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164 - MQL5
                              //https://www.mql5.com/en/code/23840 - MQL4

struct win {
   int               x;
   int               y;
   int               width;
   int               height;
   uint              clr;
};
win wnd[30];
int OnInit() {
   for (int i=0; i<ArraySize(wnd); i++) {
      wnd[i].width=rand()%200+70;
      wnd[i].height=rand()%150+50;
      wnd[i].x=rand()%(W.Width-wnd[i].width);
      wnd[i].y=rand()%(W.Height-wnd[i].height);
      wnd[i].clr=ARGB(255,rand()%150+100,rand()%150+100,rand()%150+100);
   }
   ShowAllWind();
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return(rates_total);
}

//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   static bool click = false;
   static int x_mouse=0, y_mouse=0;
   static int focus=-1, xfocus=0, yfocus=0;
   int x=(int)lparam;
   int y=(int)dparam;
   if (sparam!="1" && click) focus=-1;
   if (sparam=="1" && !click) {
      focus=-1;
      for (int i=ArraySize(wnd)-1; i>=0; i--) {
         if (wnd[i].x<x && wnd[i].y<y && wnd[i].x+wnd[i].width>x && wnd[i].y+20>y) {
            focus=i;
            xfocus=x;
            yfocus=y;
            break;
         }
      }
      if (focus>=0) ChartSetInteger(0,CHART_MOUSE_SCROLL,false);
      else ChartSetInteger(0,CHART_MOUSE_SCROLL,true);
   }
   click=(sparam=="1")?true:false;
   if (id==CHARTEVENT_MOUSE_MOVE && focus>=0) {
      wnd[focus].x+=x-xfocus;
      wnd[focus].y+=y-yfocus;
      xfocus=x;
      yfocus=y;
      ShowAllWind();
   }
   if (id==CHARTEVENT_CHART_CHANGE) ShowAllWind();
}

//+------------------------------------------------------------------+

void ShowAllWind() {
   Canvas.Erase();
   for (int i=0; i<ArraySize(wnd); i++) {
      Canvas.FillRectangle(wnd[i].x,wnd[i].y,wnd[i].x+wnd[i].width,wnd[i].y+wnd[i].height,ARGB(255,GETRGBR(wnd[i].clr)*0.5,GETRGBG(wnd[i].clr)*0.5,GETRGBB(wnd[i].clr)*0.5));
      Canvas.FillRectangle(wnd[i].x+3,wnd[i].y+23,wnd[i].x+wnd[i].width-3,wnd[i].y+wnd[i].height-3,wnd[i].clr);
      Canvas.FillRectangle(wnd[i].x+3,wnd[i].y+3,wnd[i].x+wnd[i].width-3,wnd[i].y+20,ARGB(255,GETRGBR(wnd[i].clr)*0.7,GETRGBG(wnd[i].clr)*0.7,GETRGBB(wnd[i].clr)*0.7));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+

 
Nikolai Semko:

素晴らしい

この機能、そしてこのミニウィンドウに自分でインジケータを描けるようにすることが本当に必要です。

なぜ、あるウィンドウは別のウィンドウの下に隠れ、別のウィンドウは上に寝ているのか、それを直せますか?

もう一つ質問ですが、同じインジケータを別のチャートで実行した場合、動作するのでしょうか?標準ライブラリのようにイベントが重なることはないのですか?

また、両方のウィンドウの座標が同じ場合、どちらのウィンドウがマウスでドラッグされるのでしょうか?

マウスでウィンドウサイズを変更することは可能ですか?

 
Sergey Chalyshev:

素晴らしい

この機能、そしてこのミニウィンドウに自分でインジケータを描けるようにすることが本当に必要です。

なぜ、あるウィンドウは別のウィンドウの下に隠れ、別のウィンドウは上に寝ているのか、それを直せますか?

もう一つ質問ですが、同じインジケータを別のチャートで実行した場合、動作するのでしょうか?標準ライブラリのようにイベントが重ならない?

また、両方のウィンドウの座標が同じ場合、どちらのウィンドウがマウスでドラッグされるのでしょうか?

マウスでウィンドウサイズを変更することは可能ですか?

この例では、単純にウィンドウの年功序列を実装しています。実際には、win構造体配列のインデックスが小さいほど、仮想ウィンドウの階層は低くなります。

どのような形で実装しても構いません。例えば、ウィンドウを "掴んだ "場合、そのウィンドウは画面上でも配列上でも最上位になる。

また、透明性の確保を実施することもできます。その方法はこちらで 紹介しています。(そこで、各ピスケルを処理する必要がある)。

もう一方のチャートも実行可能です。
座標が同じであれば、上にあるものがドラッグされます。

kanvas では、自分のウィンドウと他の MT ウィンドウの中ですべてを行うことができます。
さらに、MT5からウィンドウを切り離し、モニター間でもフリーフローティングさせることができます。 こちらで ご覧いただけます。

 
Nikolai Semko:

この例では、単純にウィンドウの年功序列を実装しています。基本的に、win構造体配列のインデックスが小さいほど、仮想ウィンドウ層は低くなります。

実装の仕方は自由です。例えば、あるウィンドウが "grab "されると、画面上でも配列上でも最上位になる。

また、透明性の確保を実施することもできます。その方法はこちらで 紹介しています。(そこでは、各ピスケルを処理する必要があります)。

別のチャートでも実行できるんだ。
座標が同じであれば、上にあるものがドラッグされます。

kanvasでは、自分のウィンドウと他のMTウィンドウの中ですべてを行うことができます。
さらに、ウィンドウをМТ5から取り外し、モニター間のフリーフローゾーンに移動することも可能です。 こちらで ご覧いただけます。

微妙に間違っている、おそらく正しく質問していない。

一つのプログラム(スクリプト、インジケーター)の中で、複数のウィンドウを整理することは難しくありません。

チャート上に独自の小窓でデータを表示するインジケータを作りたいのですが、どうすればいいですか?このウィンドウは、チャートの中に快適に置くことができ、マウスでドラッグすることも、マウスでウィンドウのサイズを変更することもできます(望ましいことですが、とにかくやってみることです)。チャート上で複数のインジケータを動作させ、それぞれにパラメータを設定する必要があります。異なるインジケータのイベントが重ならないようにし、インジケータがマウスイベントに適切に反応するようにする方法がまだわかっていません。キャンバスとオブジェクト、どちらがシンプルで良いのか、決めかねているんです。標準のダイアログライブラリでは何も動作しません。

 
Sergey Chalyshev:

...異なるインジケータのイベントが重ならないようにする方法がまだわからない...。

最も簡単な方法は、プロパティウィンドウの文字列変数で、グラフィカルオブジェクトの名前に追加することです。

 
Dmitry Fedoseev:

最も簡単な方法は、プロパティウィンドウの文字列変数で、グラフィカルオブジェクトの名前に追加することです。真実と会員の間で心が揺れ動く?

当然ながら、それが私の仕事です。問題は、マウスによるドラッグ&ドロップです。オブジェクトの座標が同じであれば、一方は他方のすぐ下にある。クリックすると、どれが反応するのでしょうか?

クラブとは何のことでしょうか?)

p.s. 例を見せてもらえますか?

 
Sergey Chalyshev:

当然、私もそうです。問題は、マウスによるドラッグ&ドロップです。オブジェクトの座標が同じであれば、一方は他方のすぐ下にある。クリックすると、どれが反応するのでしょうか?

クラブとは何のことでしょうか?)

p.s. 例を見せてもらえますか?

クラブを間違えました、すみません...。このクラブとはおさらばだ))。

何かひとつのオブジェクトが反応する。オブジェクトの起動時にZオーダーを変更し、他の誰よりも高くなるようにするとか。試してみるべきですね。

 
Sergey Chalyshev:

当然、私もそうです。問題は、マウスによるドラッグ&ドロップです。オブジェクトの座標が同じであれば、一方は他方のすぐ下にある。クリックすると、どれが反応するのでしょうか?

クラブとは何のことでしょうか?)

p.s. 例を見せてもらえますか?

一般に、このような状況では、最後に動かされたオブジェクトが反応するはずです - 上にあるのですから...。

理由: