MQL5にて独自のグラフィカルパネルを作成する
MetaQuotes | 1 2月, 2016
はじめに
標準ライブラリ.にて使用できる新しいクラス群があります。これらのクラスはMQL5プログラムのディスプレィパネルやコントロールダイアログの開発のために設計されています。
このクラスはカスタムインターフェースコンポーネントを根底のもでrうであるイベント駆動型モデルを用いて作成することを可能にします。すべては組み込まれたチャートオブジェクトやターミナルのイベントに基づています。
開発されたクラスは、以下の方法で使用することができます:- 個別チャートウィンドウでのディスプレイパネル:
- エキスパートアドバイザーのためのコントロールパネル:
- カスタムディスプレィコントロールパネル
この記事は、あなた独自のディスプレィパネルを個別チャートウィンドウに標準ライブラリを用いていかに簡単に作成できるかを示します。
標準ライブラリは何を提供しているのでしょうか?
標準ライブラリは、以下のすでに出来上がったコントローラを開発者に提供しています。
1. シンプルコントロール:
コントロール | アプリケーション | 組み込みオブジェクトに基づく実装 | 標準ライブラリファイル |
テキスト付きボタン | マウスとMQLプログラム間の連携の保証 | "ボタン" | <Controls\Button.mqh> |
イメージ付きボタン | マウスとMQLプログラム間の連携の保証 | "グラフィックラベル" | <Controls\BmpButton.mqh> |
編集 | テキスト情報のディスプレィ、入力モード | "編集" | <Controls\Edit.mqh> |
キャプション | 補助テキスト情報のディスプレイ | "テキストラベル" | <Controls\Label.mqh> |
パネル | 補助コントロール (コントールのビジュアルグループ化) | "長方形" | <Controls\Panel.mqh> |
イメージ | 装飾用コントロール | "グラフィックラベル" | <Controls\Picture.mqh> |
2. 複雑なコントロール:
コントロール | アプリケーション | コントロールに基づく実装 | 標準ライブラリファイル |
リスト | リストの表示 | "長方形", "ボタン付きイメージ" と"編集" | <Controls\List.mqh> |
ドロップダウンリスト付きフィールド | Selection from a drop-down list | "編集"、 "イメージ付きボタン"と "リスト" | <Controls\ComboBox.mqh> |
Increment/decrement field | 列挙値 | "編集" と"イメージ付きボタン" | <Controls\SpinEdit.mqh> |
ラジオボタン | スイッチ | "イメージ付きボタン"と"キャプション" | <Controls\RadioButton.mqh> |
ラジオボタングループ | 列挙型の編集フィールド | "長方形" と"ラジオボタン" | <Controls\RadioGroup.mqh> |
チェックボックス | 選択オプション | "イメージ付きボタン"と"キャプション" | <Controls\CheckBox.mqh> |
チェックボックスグループ | フラッグの編集 | "長方形"と"チェックボックス" | <Controls\CheckGroup.mqh> |
ダイアログ | ダイアログフォーム | "長方形", "ボタン付きイメージ" と"編集" | <Controls\Dialog.mqh> |
ディスプレィパネルの作成
まず用語の定義から始めましょう。そのディスプレィパネルは、描画バッファのない個別ウィンドウカスタムディスプレィパネルを表現するための用語です。そのようなパネルは単にターミナルに組み込まれたチャートオブジェクトを用いて必要な情報を表示します。以下が表示される情報です:
- 数字
- テキスト、
- 色、
- など
必要なステップごとに詳細に見ていき、以下のようなグラフィカルパネルを作成しましょう:
ディスプレィパネルを作成するために、二つのファイルが必要です:
- ディスプレィパネルクラスの詳細を含むインクルードファイル
- インジケーターソースコードファイル
MQL5 ウィザードを用いてこれらのファイルのテンプレートを取得します。インジケーターディレクトリ(MQL5\Indicators)に、MyIndicatorsとMyPanelというフォルダを作成してください。フォルダを作成するプロセスは、Helpにて記載されているためこちらでは紹介しません。
クラスの記述
すでにワーク用フォルダを作成しました。"Navigator"ウィンドウを見つけ、右クリックしてください。表示したメニューの"New File"を選択します。そして、その中から"New Class" を選び、"Next >"をクリックします。以下のクラスの記述のダイアログを完成させてください。
"Finish"をクリックしてください。結果として、以下のコードを取得します:
//+------------------------------------------------------------------+ //| PanelDialog.mqh | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CPanelDialog : public CAppDialog { private: public: CPanelDialog(); ~CPanelDialog(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CPanelDialog::CPanelDialog() { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CPanelDialog::~CPanelDialog() { } //+------------------------------------------------------------------+
インクルード<Controls\Dialog.mqh>ファイルをベースクラスCAppDialogとコメント付きの標準ライブラリから追加してください。
//+------------------------------------------------------------------+ //| PanelDialog.mqh | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include <Controls\Dialog.mqh> //+------------------------------------------------------------------+ //| CPanelDialog class | //| Function: main application dialog | //+------------------------------------------------------------------+ class CPanelDialog : public CAppDialog { private: public: CPanelDialog(void); ~CPanelDialog(void); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CPanelDialog::CPanelDialog(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CPanelDialog::~CPanelDialog(void) { } //+------------------------------------------------------------------+
そのインジケーター内のダイアログボックスの使用を可能にするクラスの記述ができました。そのダイアログは現在空ですが、後ほどコントロールを追加していきます。今はそのインジケーターに進みましょう。
インジケーターSource Code
そのインジケーターは、MQL5ウィザードを用いて作成されます。そのアクションは、クラスを記述する際のものに似ています。唯一の違いは、MQL5ウィザードに提供されたオプションから「Custom Indicator」を選択するという点です。インジケーター作成のために、3つのダイアログが完成されます。
最初のものは、インジケーター名を明記する必要があります:
2番目のダイアログにて、"OnChartEvent" (必要)と "OnTimer"にチェックをつけてください:
"Separate Window Indicator" (必要) を3番目のダイアログにてチェックをつけてください:
そして、"Finish"をクリックしてください。生成されるコードは以下の通りです:
//+------------------------------------------------------------------+ //| PanelIndicator.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+
テンプレートは以下を追加することで完成します:
- インジケータープロパティのかけている記述;
- ダイアログのクラス記述を含むインクルードファイル;
- グローバル変数 - ダイアログのクラスオブジェクト;
- アプリケーションを開始し、OnInit関数にタイマーを作成し、ダイアログ作成するためのコード
- ダイアログとタイマーを破壊するコードを含むOnDeinit()関数
- コードを呼び出すイベントハンドラへのOnChartEvent(...) 関数;
- コメント
すでに出来上がったインジケータを取得しました。
//+------------------------------------------------------------------+ //| PanelIndicator.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_plots 0 #property indicator_buffers 0 #property indicator_minimum 0.0 #property indicator_maximum 0.0 //+------------------------------------------------------------------+ //| Include files | //+------------------------------------------------------------------+ #include "PanelDialog.mqh" //+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ CPanelDialog ExtDialog; //+------------------------------------------------------------------+ //| Initialization | //+------------------------------------------------------------------+ int OnInit() { //--- creating the application dialog if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130)) return(-1); //--- starting the application if(!ExtDialog.Run()) return(-2); //--- creating the timer EventSetTimer(1); //--- success return(0); } //+------------------------------------------------------------------+ //| Deinitialization | //+------------------------------------------------------------------+ int OnDeinit() { //--- destroying the dialog ExtDialog.Destroy(); //--- killing the timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Iteration | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- returning the prev_calculated value for the next call return(rates_total); } //+------------------------------------------------------------------+ //| Timer event handler | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ //| Chart event handler | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- handling the event ExtDialog.ChartEvent(id,lparam,dparam,sparam); } //+------------------------------------------------------------------+
上記のフォームでのインジケーターは未だ何も表示しません。チャートのナビゲーターからコンパイルされ、ダウンロードされた際、個別ウィンドウにて空のダイアログとして表示されます。
ダイアログが空の状態にも関わらず、インジケーターはすでに特定の機能を獲得しています:
- サブウィンドウの高さは作成中にインジケーターによってダイアログの高さに調整されています;
- ダイアログの幅は、チャートの幅に常に等しくなります;
- そのインジケーターは、サブウィンドウの最小化・最大化を行うことができます。
表示してみましょう。
パネルが情報を表示し始めるために、以下の3つの質問に対する答えを決めなければなりません。
- どのような情報を表示したいか?
- どのような追加のディスプレィ要素とコントロールがダイアログに配置される必要があるか?
- これらの追加の要素/コントールはどのように連携するか?
別の重要な要因は、ダイアログが視覚的に見えやすいか、ユーザーに優しい設計かという点です。ダイアログの機能性に影響しませんが、そのMQL5プログラムのユーザーを大切にしていることを示します。
ステップ1. どのような情報を表示したいか?
この記事は学習ツールを提供しているので、インジケーターの使用しやすさについて塾講してみあしょう。色は、3つのパラメーターの機能として表示されます。そのパラメーターを過度に複雑化してはいけません - これらは”赤”、”緑”、”青”の3色のみです。
そのパラメーター値は、以下のように設定されます:
- "赤" の値は、Calculateイベントにてランダムに変化する0から255までの範囲でセットされます;
- "緑"の値は、タイマーイベント時にランダムに0から255の範囲で設定されます。
- "青" の値はスペシャルコントロールによって、手動でランダムに0から255の範囲で設定され、変更されます。
これらの値はインジケーターでも表示されます。
ステップ2. 追加のコントロールは何が必要ですか?
- カラーは、"パネル"コントロールを用いて表示されます。
- "赤"と"緑"は、”Edit”コントロールを用いて"読み取り専用"モードにて表示されます。
- "青"は、Spin Edit””コントロールによって管理されます。同じコントロールが値の表示に使用されます。
- "Edit"と"Spin Edit" コントールは、”キャプション”コントロールによって補助的なキャプション付きで向上されます。
標準ライブラリからインクルードファイルを追加し、また、クラスの記述にパラメーター値を保存する変数とコントロールも追加します。
以下を記述します:
//+------------------------------------------------------------------+ //| PanelDialog.mqh | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include <Controls\Dialog.mqh> #include <Controls\Panel.mqh> #include <Controls\Edit.mqh> #include <Controls\Label.mqh> #include <Controls\SpinEdit.mqh> //+------------------------------------------------------------------+ //| CPanelDialog class | //| Function: main application dialog | //+------------------------------------------------------------------+ class CPanelDialog : public CAppDialog { private: //--- additional controls CPanel m_color; // object for displaying color CLabel m_label_red; // "red" level caption object CEdit m_field_red; // "red" value display object CLabel m_label_green; // "green" level caption object CEdit m_field_green; // "green" value display object CLabel m_label_blue; // "blue" level caption object CSpinEdit m_edit_blue; // "blue" value control object //--- parameter values int m_red; // "red" value int m_green; // "green" value int m_blue; // "blue" value public: CPanelDialog(void); ~CPanelDialog(void); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CPanelDialog::CPanelDialog(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CPanelDialog::~CPanelDialog(void) { } //+------------------------------------------------------------------+
ステップ3これらの追加ダイアログコントールがどのように追加するのか?
ダイアログコントール間での連携の原則はとてもシンプルです - "そのダイアログは、(赤、緑、青の)どのパラメーターにおける変更も表示する"連携のアルゴリズムの実装は、そろそろダイアログを作成開始するころなので後ほど言及します。
視覚アピールに関するいくつかのコメント
ダイアログ作成に移る前に、視覚アピールについて簡単に理解しましょう。よく言えば、ユーザーに優しい調整やダイアログコントロールの再調整です。Named constants (#define)がこの目的に最も適しています。
既に定義された定数によっていくつかの利点が提供されています:
- 特定のケースにおいて使用される数値は、記憶される必要はありません。定数名は正確に選択された定数は、「Auto List names」を経由してそれらに即刻のアクセスを提供します。
- 定数値が修正される際、数値は、検索され置換される必要はありmせん。定数の記述のみを変更するだけで十分です。
以下の定数の使用が推奨されています:
//+------------------------------------------------------------------+ //| defines | //+------------------------------------------------------------------+ //--- indents and spacing #define INDENT_LEFT (11) // left indent (including the border width) #define INDENT_TOP (11) // top indent (including the border width) #define INDENT_RIGHT (11) // right indent (including the border width) #define INDENT_BOTTOM (11) // bottom indent (including the border width) #define CONTROLS_GAP_X (10) // spacing along the X-axis #define CONTROLS_GAP_Y (10) // spacing along the Y-axis //--- for labels #define LABEL_WIDTH (50) // size along the X-axis //--- for edits #define EDIT_WIDTH (50) // size along the Y-axis #define EDIT_HEIGHT (20) // size along the Y-axis //--- for base colors (RGB) #define BASE_COLOR_MIN (0) // minimum value of the color component #define BASE_COLOR_MAX (255) // maximum value of the color component
ディスプレィパネルの記述
以前ディスプレィパネルクラスを作成しました。;それでは、必要な機能を獲得するために以下を実行する必要があります:
1. 親クラスのCreate(...)メソッドを再定義してくださいもともと、そのメソッドは以下の通りになっています:
//+------------------------------------------------------------------+ //| Creation | //+------------------------------------------------------------------+ bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) { //--- calling the method of the parent class if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false); //--- additional controls shall be created here //--- success return(true); }
2. 追加コントロールの作成
豆知識追加のコントロールの作成のためのコードは、もちろん直接Create(...)メソッドに挿入されますが、読まれない大きな”塊”を得るリスクがあります。
したがって、その作成プロセスはメソッドによって示された部分に分類されます:
- bool CreateColor(void) - カラーパネル作成,
- bool CreateRed(void) - 説明用キャプション付きディスプレィ「赤色」パーツの作成,
- bool CreateGreen(void) - 説明用キャプション付きディスプレィ「緑色」パーツの作成
- bool CreateBlue(void) - 説明用キャプション付きディスプレィ「青色」パーツの作成
これらのメソッドは、Create(...) メソッドから連続で呼び出されます:
//+------------------------------------------------------------------+ //| Creation | //+------------------------------------------------------------------+ bool CPanelDialog::Create(const long chart,const string name,const int subwin, const int x1,const int y1,const int x2,const int y2) { //--- calling the parent class method if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false); //--- creating additional elements if(!CreateColor()) return(false); if(!CreateRed()) return(false); if(!CreateGreen()) return(false); if(!CreateBlue()) return(false); //--- success return(true); }
コントロールの作成
すべての追加コントロールの作成を見直しますが、bool CreateBlue(void)メソッドを詳しく見ていきます。
以下の通りです:
//+------------------------------------------------------------------+ //| Creating the "Blue" control with explanatory caption | //+------------------------------------------------------------------+ bool CPanelDialog::CreateBlue(void) { //--- coordinates int x1=INDENT_LEFT; int y1=INDENT_TOP+2*(EDIT_HEIGHT+CONTROLS_GAP_Y); int x2=x1+EDIT_WIDTH; int y2=y1+EDIT_HEIGHT; //--- creating the caption if(!m_label_blue.Create(m_chart_id,m_name+"LabelBlue",m_subwin,x1,y1+1,x2,y2)) return(false); if(!m_label_blue.Text("Blue")) return(false); if(!Add(m_label_blue)) return(false); //--- adjusting coordinates x1+=LABEL_WIDTH+CONTROLS_GAP_X; x2=x1+EDIT_WIDTH; //--- creating the control if(!m_edit_blue.Create(m_chart_id,m_name+"Blue",m_subwin,x1,y1,x2,y2)) return(false); if(!Add(m_edit_blue)) return(false); m_edit_blue.MinValue(BASE_COLOR_MIN); m_edit_blue.MaxValue(BASE_COLOR_MAX); m_edit_blue.Value(m_blue); //--- success return(true); }
二つの意味合いがあります:
- そのコントロールは、関連する座標にて作成されます。つまり、その相対位置は、コントロールが作成後追加される根底なの上左角に相対的に配置されます。
- その作成の後、Add(...)メソッドを用いてコンテナにコントロールを追加する必要があります。この場合、そのダイアログはコンテナとして機能します。
パラメーターの変更
カラーパネルの色を変化するため、SetColor(void)メソッドを追加します;
パラメーターを外部で変更できるようにするため、3つのパブリックメソッドを追加します:
- void SetRed(const int value) - 「赤」のレベルを変更し、インジケーターにその変化を表示します、
- void SetGreen(const int value) - 「緑」のレベルを変化させ、インジケーターにその変化を表示します、
- void SetBlue(const int value) - 「青」のレベルを変化させ、インジケーターにその変化を表示させます。
その「変化をインジケーターに表示する」という部分は、カラーレベルの新しい値を一致するコントロールに数値で表示させ、カラーパネルの色を変化させるという意味です。
以下は、その例としてメソッドのコードを記載しています:
//+------------------------------------------------------------------+ //| Setting the "Red" value | //+------------------------------------------------------------------+ void CPanelDialog::SetRed(const int value) { //--- checking if(value<0 || value>255) return; //--- saving m_red=value; //--- setting m_field_red.Text(IntegerToString(value)); //--- setting the panel color SetColor(); }
上記で同意されているように:
関連するコードを元のインジケーターに追加しましょう:
//+------------------------------------------------------------------+ //| PanelIndicator.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_plots 0 #property indicator_buffers 0 #property indicator_minimum 0.0 #property indicator_maximum 0.0 //+------------------------------------------------------------------+ //| Include files | //+------------------------------------------------------------------+ #include "PanelDialog.mqh" //+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ CPanelDialog ExtDialog; //+------------------------------------------------------------------+ //| Initialization | //+------------------------------------------------------------------+ int OnInit() { //--- creating the application dialog if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130)) return(-1); //--- starting the application if(!ExtDialog.Run()) return(-2); //--- creating the timer EventSetTimer(1); //--- success return(0); } //+------------------------------------------------------------------+ //| Deinitialization | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroying the dialog ExtDialog.Destroy(); //--- killing the timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Iteration | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- changing the dialog property ExtDialog.SetRed(MathRand()%256); //--- returning the prev_calculated value for the next call return(rates_total); } //+------------------------------------------------------------------+ //| Timer event handler | //+------------------------------------------------------------------+ void OnTimer() { //--- changing the dialog property ExtDialog.SetGreen(MathRand()%256); } //+------------------------------------------------------------------+ //| Chart event handler | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- handling the event ExtDialog.ChartEvent(id,lparam,dparam,sparam); } //+------------------------------------------------------------------+
イベントのハンドリング
ダイアログとターミナルの連携は、ダイアログコントロール間の連携と同様に、イベントメカニズムに基づいています。機能を見直しませんが、使用していきます。
イベントは従来二つのグループに分類されます:
- ターミナルイベントキューを迂回してハンドルされる内部イベント;
- ターミナルイベントキューを通してハンドルされる外部イベント。
二つの種類のイベントを扱っていきます。
内部イベントの中で、ダイアログのサイズ調整を行うイベントのみハンドルされる必要があります。この目的のために、親クラスのOnResize()メソッドを再ロードしてください。私たちのメソッドは、ダイアログの高さに変更がないためシンプルになっています;もしそのダイアログの幅が変われば、カラーパネルの幅を修正する必要があります。
//+------------------------------------------------------------------+ //| Resize handler | //+------------------------------------------------------------------+ bool CPanelDialog::OnResize(void) { //--- calling the parent class method if(!CAppDialog::OnResize()) return(false); //--- changing the color panel width m_color.Width(ClientAreaWidth()-(INDENT_RIGHT+LABEL_WIDTH+CONTROLS_GAP_X+EDIT_WIDTH+CONTROLS_GAP_X+INDENT_LEFT)); //--- success return(true); }
外部イベントリストは、一つのアイテムのみに制限されています - 「青」レベルを変更するイベントです。外部イベントハンドラの必要性は最小です:そのハンドラは、Void型のパラメーターのないクラスメソッドです。
:このイベントのハンドラを紹介します;
//+------------------------------------------------------------------+ //| Handler of the event of changing the "blue" level | //+------------------------------------------------------------------+ void CPanelDialog::OnChangeBlue(void) { //--- saving m_blue=m_edit_blue.Value(); //--- setting the panel color SetColor(); }
ご覧の通り、難しいことはありません。
ダイアログが外部イベントを扱うために、親クラスメソッドは再ロードされます。
virtual bool OnEvent(const int id,const long &lparam, const double &dparam,const string &sparam);
少し不思議な点があります。もしPanelDialog.mqhファイルをエディターにて開ければ、OnEvent(...)メソッド内に何もないことがわかるでしょう。
混乱しないでください - 外部イベントをハンドリングする記述において、一連のマクロが作成されました(標準ライブラリの<Controls\Defines.mqh>ファイルをご覧ください。).
イベントハンドラは以下の通りです:
//+------------------------------------------------------------------+ //| Handling events | //+------------------------------------------------------------------+ EVENT_MAP_BEGIN(CPanelDialog) ON_EVENT(ON_CHANGE,m_edit_blue,OnChangeBlue) EVENT_MAP_END(CAppDialog)
このコードは一見わかりにくいですが、以下の事を行っています:
- ON_CHANGEイベントがm_edit_blueコントロールから取得された際、OnChangeBlueメソッドが呼ばれ、イベントのハンドリングが終了します(trueを返す)
- その他のイベントを受け取り、コントロールが親クラスのメソッドに渡されます。
結論
この記事にて、標準ライブラリクラスを用いてディスプレィパネルを作成するプロセスをご覧いただきました。
作成されたインジケーターを用いることはないかもしれませんが、不必要な情報ばかりではなく、作成時のプロセスの特徴をカバーしました。
より複雑な標準デリバリの例はターミナルの以下のディレクトリにてご覧になれます:
- Experts\Examples\Controls\
- Indicators\Examples\Panels\ChartPanel\
- Indicators\Examples\Panels\SimplePanel\