記事"CCanvas クラスを知る透明なオブジェクトの描画方法"についてのディスカッション

 

新しい記事 CCanvas クラスを知る透明なオブジェクトの描画方法 はパブリッシュされました:

みなさんは移動平均のぎこちないグラィック以上のものが必要ですか?ターミナルにただ色がついている長方形よりも見栄えの良い何かを描画してみたいですか?ターミナルには魅力的なグラフィックを描くことができるのです。それはカスタムグラフィックを作成する CСanvas クラスで実装することができます。このクラスで透明性を取り入れ、色を混ぜ、オーバーラップと色の混ぜ合わせによって透明の錯覚を産み出すことができるのです。

MetaTrader 5 での描画はシンプルで、たった数個の細かい部分の知識が必要なだけです。その一つはターミナルスクリーンのデザイン方法です。もっと正確に言うと、グラ フィックが画面に出力される方法に関心があるのです。たとえば、グラフは前景または背景に表示されます。画面への色出力はグラフの表示に依存します。グラ フィックオブジェクトの中にはオーバーラップや交わる部分で色を変えるものもあります。

CCanvas クラスでの描画に直接進む前に、色処理に関する定義をいくつか分析します。たとえば、アルファチャンネルの意味を明確にします。

私見ですが、透明性の実装はもっとも重要な技術で、それは画像を生き生きとさせるものです。たとえば、透明性は色の遷移や影が滑らかでより魅力ある インターフェースを実装するのに使用されます。影はグラフィックオブジェクトに立体感を添え、視覚的にオブジェクトの角を柔らかくします。

5. 透明性の錯覚

これで透明性の実践的実装に進むことができます。

着色された長方形をたくさん描きます(スクリプト"xor.mq5")。色処理メソッドの違いを説明するために、チャートの一番上に重複なしの横向きのキャンバスを3つ使います。

1番目は COLOR_FORMAT_XRGB_NOALPHA を、2 番目は COLOR_FORMAT_ARGB_RAW を、3番目は COLOR_FORMAT_ARGB_NORMALIZE を使って処理します。透明度を徐々に 255 (完全不透明)から 0 (完全透明)に変えていきます。われわれのスクリプト名を"Illusion.mq5"とします。

ビデオでスクリプト"Illusion.mq5" がどのように動作するか示されています。


図11 スクリプト illusion.mq5 の動作

作者: Karputov Vladimir

 
ウラジミール、僕はキャンバスが苦手なんだ。ここで質問です。キャンバスがあります。その上にテキストラベルがあります。なぜ端末はマークをクリックしたイベントをキャンバスをクリックしたイベントとして見てしまうのでしょうか?この矛盾はどうにか解決できないでしょうか?
 
denkir:
ウラジミール、僕はキャンバスが苦手なんだ。ここで質問です。キャンバスがあります。その上にテキストラベルがあります。なぜ端末はラベルをクリックしたイベントをキャンバスをクリックしたイベントとして見てしまうのでしょうか?この矛盾はどうにか解決できないでしょうか?
コードを教えてください。見てみよう。
 
denkir:
...

この優先順位を設定するプロパティがあります:

OBJPROP_ZORDER- グラフィカル・オブジェクトがチャート上のマウス・クリック・イベント(CHARTEVENT_CLICK)を受け取る優先順位。デフォルトでは、この値は作成時にゼロに設定されますが、必要に応じて優先度を上げることができます。重なっているオブジェクトがCHARTEVENT_CLICKイベントを受信する場合、優先順位が他のオブジェクトより高い1つのオブジェクトだけが受信します。

 

後でコードを送ります。OBJPROP_ZORDER- for kanvas が設定できない...

不正確な処理の原因がわかりました...。キャンバスは2枚あり、1枚はもう1枚に重なっています。そして上にテキスト・ラベルがある。OnChartEvent()が見ていないのはこれだ。

 
denkir:

後でコードを送ります。OBJPROP_ZORDER- for kanvas が設定できない...

不正確な処理の原因がわかりました...。キャンバスは2枚あり、1枚はもう1枚に重なっています。そして上にテキスト・ラベルがある。それがOnChartEvent()が見ていないところです。

はい、見ることができます。OBJ_BITMAP_LABELやOBJ_BITMAPのような普通のオブジェクトです。

 
tol64:

できます。OBJ_BITMAP_LABELやOBJ_BITMAPのような普通のオブジェクトです。

そうだね。ありがとう。

そのためには、 バインドされている チャート・オブジェクトの 名前を引っ張ってきて、優先順位を与える 必要があります

そういうことです(初期化ブロックより抜粋):

//--- 1つ目のキャンバスを作成する
   if(!myCanvas1.CreateBitmapLabel("My canvas1",_X,_Y,Width,Height,COLOR_FORMAT_ARGB_RAW)) 
     {
      Print("Error creating base canvas: ",GetLastError());
      return INIT_FAILED;
     }
//--- 表示
   myCanvas1.Erase(XRGB(0x1F,0x1F,0x1F)); 
   myCanvas1.Update();
   string obj_name=myCanvas1.ChartObjectName();
   if(!ObjectSetInteger(0,obj_name,OBJPROP_ZORDER,0))
      return INIT_FAILED;
 

こんにちは、ウラジミール、

興味深い記事をありがとう。

表3に少し誤りがあります。

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 白(背景)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
とする:
0000 0000 1111 1111 0000 0000
グリーン
 
angevoyageur:

こんにちは、ウラジミール、

興味深い記事をありがとう。

表3に少し誤りがあります。

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 白(背景)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
とする:
0000 0000 1111 1111 0000 0000
グリーン
緑色で表示されます。
 

質問はこうだ。カンヴァスをグラフ上で移動させるには、どのような実装が最適でしょうか?何らかの方法:

bool CUserCanvas::Move(int _new_x,int _new_y);
 
denkir:

質問はこうだ。カンヴァスをグラフ上で移動させるには、どのような実装が最適でしょうか?何らかの方法:

移動させる目的は?カンヴァス上に描画を再描画する方が良いのでしょうか?