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

 
ウラジミール、僕はキャンバスが苦手なんだ...。

キャンバスにいろいろな形を描いて、それを重ね合わせます。ブレンドせずに色を 元のままにするにはどうすればいいでしょうか?

COLOR_FORMAT_XRGB_NOALPHA を設定したのですが、混色してしまいます :-((.

しかし、こんなバリエーションもある。CDialogタイプのダイアログにCPictureタイプの画像が添付されています。それはCCanvas型のリソースにリンクされています。後者はウィンドウにバインドされずに作成されます。

 
Dennis Kirichenko:
ウラジミール、僕はキャンバスが苦手なんだ...。 キャンバスにいろいろな形を描いて、それを重ね合わせます。ブレンドせずに

色を 元のままにするにはどうすればいいでしょうか?

COLOR_FORMAT_XRGB_NOALPHA を設定したのですが、ブレンドされてしまいます :-((

...

クナバス

キャンバスに描かれた色(仮に "トップ "または最後と呼ぶ)は、先にキャンバスに描かれた色に置き換わります。

//+------------------------------------------------------------------+
//|canvas+xor.mq5||キャンバス
//|Copyright © 2015, Vladimir Karputov |
//|http://wmua.ru/slesar/|( 英語
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- スクリプトの起動時に、入力パラメータのウィンドウを表示する。
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- 入力
input uchar alfa=150;         // 色の透明度を管理するアルファチャンネル
//--- チャートの幅と高さを可変にする。
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- チャートの幅と高さ
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- キャンバスを作成する COLOR_FORMAT_XRGB_NOALPHA
   CCanvas canvas_XARGB_NORMALIZE;
   if(!canvas_XARGB_NORMALIZE.CreateBitmapLabel("canvas_XARGB_NORMALIZE",0,0,
      ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return;
     }
   canvas_XARGB_NORMALIZE.Erase(ColorToARGB(clrAqua,255));
//--- 矩形 #1 を作成する
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3秒間待つ
   Sleep(3000);
//--- 長方形を作る #2
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 3秒間待つ
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| チャート・プロパティの幅|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- プロパティ値を取得するための変数を準備する。
   long result=-1;
//--- エラー値をリセットする
   ResetLastError();
//--- プロパティ値を受け取る
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- エキスパートジャーナルにエラーメッセージを表示する。
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- チャート・プロパティの値を返す。
   return((int)result);
  }
//+------------------------------------------------------------------+
//| チャート・プロパティの高さ|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- プロパティ値を取得するための変数を準備する。
   long result=-1;
//--- エラー値をリセットする
   ResetLastError();
//--- プロパティ値を受け取る
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- エキスパートジャーナルにエラーメッセージを表示する。
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- チャート・プロパティの値を返す。
   return((int)result);
  }
//+------------------------------------------------------------------+
ファイル:
 

ウラジミール、どうもありがとう!

ColorToARGB()の変換を見落としていました。

 
Dennis Kirichenko:

ウラジミール、どうもありがとう!

ColorToARGB()の変換を見落としていました。

どういたしまして :) .
 
この記事は素晴らしいと思います。座標x1,x2,y1,y2で画面上に矩形を作るにはどうしたらいいでしょうか?

x1 = 時間[1]

x2 = 時間[0]

y1 = オープン[1]

y2 = Close[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
この記事は素晴らしいと思います。座標x1,x2,y1,y2で画面上に矩形を作るにはどうしたらいいでしょうか?

x1 = 時間[1]

x2 = 時間[0]

y1 = オープン[1]

y2 = Close[1]

クラスCCanvas?

追伸:CCanvas.CreateBitmapを 使う:

チャート・オブジェクトにバインドされたグラフィカル・リソースを作成します。

1.現在のチャートのメイン・ウィンドウにグラフィカル・リソースを作成します。

bool CreateBitmap(
const string 名前を指定します、 // name
const datetimetime// 時間
const doubleprice// 価格
constintwidth// 幅
const int 高さ// 高さ
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// フォーマット
);

こうして、キャンバスの一角をバインドできるようになる。ただし、幅と高さはすべてピクセルで設定されます。

 

もっと簡単に練習してみよう。円は価格と一緒に動くが、なぜY軸に動かないのか?

これがコードだ。

void OnStart()
  {
   int ChartWidth=ChartWidthInPixels();
   int ChartHeight=ChartHeightInPixelsGet();

   CCanvas pepe;

   int t1,t0,p1,p0;
   ChartTimePriceToXY(0,0,Time[1],Open[1],t1,p1);
   ChartTimePriceToXY(0,0,Time[0],Close[1],t0,p0);

   pepe.CreateBitmapLabel("canvas_XRGB_NOALPHA",0,0,ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_RAW);
   pepe.Erase(0);
   pepe.FillCircle(t0,p0,25,ColorToARGB(clrBlue,255));
   pepe.Update();
   return(rates_total);
  } 
 
Jorge Fernando De Los Ríos De Los Ríos:

もっと簡単に練習してみよう。円は価格と一緒に動くが、なぜY軸に動かないのか?

これがそのコードだ。

このスクリプトはコンパイルされていない。このスクリプトはコンパイルされていない。
 
Jorge Fernando De Los Ríos De Los Ríos:

もっと簡単に練習してみよう。円は価格と一緒に動くが、なぜY軸に動かないのか?

これがコードだ。

"時間[]", "終値[]"- の間違いです。MQL5にはそのような変数はありません!
 
Karputov Vladimir:
"タイム[]", "クローズ[]"- の間違いです。MQL5にはそのような変数はない!
MQL4 ;)