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

 
Artyom Trishkin:
MQL4 ;)

私はMQL4を歓迎しない。すべての例はMQL5のみです。

//+------------------------------------------------------------------+
//|テストmq5
//|著作権© 2016, ウラジーミル・カルプトフ|||Copyright © 2016, Vladimir Karputov
//|http://wmua.ru/slesar/|( 英語
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
CCanvas     m_canvas;           // キャンバス・オブジェクト
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime arr_time[];
   double   arr_open[];
   double   arr_close[];
   if(CopyTime(Symbol(),Period(),0,2,arr_time)==-1)
      return;
   if(CopyClose(Symbol(),Period(),0,2,arr_close)==-1)
      return;
   if(CopyOpen(Symbol(),Period(),0,2,arr_open)==-1)
      return;
   int x1,y1,x2,y2;
   if(!ChartTimePriceToXY(0,0,arr_time[0],arr_open[0],x1,y1))
      Print("Error ",GetLastError());
   if(!ChartTimePriceToXY(0,0,arr_time[1],arr_close[0],x2,y2))
      Print("Error ",GetLastError());
//x1 = Time[1];
//y1 = Open[1];
//x2 = Time[0];
//y2 = Close[1];
   Print("arr_time[0]=",arr_time[0],", arr_open[0]=",arr_open[0]);
   m_canvas.CreateBitmapLabel("COLOR_FORMAT_ARGB_NORMALIZE",x1,y1,MathAbs(x2-x1),MathAbs(y2-y1),COLOR_FORMAT_ARGB_NORMALIZE);
   m_canvas.Erase(ColorToARGB(clrBlue,200));
   m_canvas.Update();
   Sleep(10000);
   m_canvas.Destroy();
  }
//+------------------------------------------------------------------+
//| チャートの幅をピクセル単位で取得します。|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+

そしてスクリプトの結果:

結果

 

ウラジミール、専門家のあなたに質問です。

キャンバスの形をしたパネルがあります。そしてチャート上にトレンドラインが描かれています。キャンバスの後ろに隠す方法を教えてください。

 
Dennis Kirichenko:

ウラジミール、専門家のあなたに質問です。

キャンバスの形をしたパネルがあります。そしてチャート上にトレンドラインが描かれています。それをキャンバスの後ろに隠すにはどうすればよいでしょうか?


例えば、パネルを壊してもう一度描くとか・・・。
 
ああ、ありがとう。今のところ、背景にオブジェクトを置くだけのアイデアを思いついたんだけど......。
削除済み  
Vladimir Karputov:
記事をありがとう。残念ながら、その中のドキュメントへのリンクはすべて壊れています。
 
Alexey Kozitsyn:
記事をありがとう。残念ながら、その中のドキュメントリンクはすべて壊れています。

メッセージありがとうございます - ヘルプは再構築されました。リンクを修正します。

 
Vladimir Karputov:

クラスCCanvas?

追伸:CCanvas.CreateBitmapを使って ください:

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

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

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

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


ここでロシア語で書いていいのだろうか。

というのも、あなたは一方的に指示を出して いるが、実際にはダブルスタンダードを公言しているからだ。

 
Alexey Kozitsyn:
記事をありがとう。残念ながら、その中のドキュメントへのリンクはすべて壊れています。
リンクは修正しました。メッセージをありがとう。
 
Alexey Petrov:
リンクを修正しました。メッセージをありがとう。

エラーが残っています。

はじめの段落:

...

CCanvas クラスを使って直接描画を始める前に、色の処理に関するいくつかの定義を学ぶ必要があります。たとえば、透明度とは何か、アルファ・チャンネルとは何か、などです。

...


項目 "5.1 スクリプト "Illusion.mq5" を作成する"

...

描かれた円を描きます。円は、キャンバスを塗りつぶした色の上に描かれます(canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));)。

canvas_XRGB_NOALPHA.CreateBitmapLabel - チャートオブジェクトにバインドされたグラフィックリソースを作成します。

キャンバス全体を ARGB フォーマットの色で塗りつぶします

テキストを出力- このキャンバスの画像処理の種類。アルファ・チャンネルが255に等しいARGBフォーマットのテキスト色、つまり出力テキストの色。

描画したものをすべて画面に表示させたい場合は、画面をリフレッシュする必要が あります。

グラフィック・リソースはチャート・オブジェクトにバインドして作成したので(CreateBitmapLabel メソッド)、Destroy() メソッドを使ってリソースを削除します。

...

 

はじめまして、皆さん。情報 パネルを、取引のアイコンが上に重ならないようにする方法を教えてください。

前景にあるようで、すべてが後ろに描かれているのですが、案件が上に重なっています。

void CreateEdit(long             chart_id,         // チャートID
                int              sub_window,       // ウィンドウ(サブウィンドウ)番号
                string           name,             // オブジェクト名
                color            font_color,       // フォントの色
                int              x_size,           // 幅
                int              y_size,           // 高さ
                int              x_distance,       // X軸座標
                int              y_distance,       // Y軸座標
                long             z_order,          // 優先順位
                color            background_color) // 背景色 
  {
// オブジェクトが正常に作成された場合、...
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ...プロパティを設定する
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // グラフの角度を設定する
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // フォントの色
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // 背景色
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // 幅
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // 高さ
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // X座標を設定する
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // Y座標の設定
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         // FALSEの場合、オブジェクトは選択できない
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // オブジェクトの優先順位
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // 読み取り専用
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // 左揃え
      //--- 前景(false)または背景(true)に表示する。 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // もし"˶n "ならツールチップはない。
     }
  }