MQL5にて独自のグラフィカルパネルを作成する

MetaQuotes | 1 2月, 2016

はじめに

標準ライブラリ.にて使用できる新しいクラス群があります。これらのクラスはMQL5プログラムのディスプレィパネルやコントロールダイアログの開発のために設計されています。

このクラスはカスタムインターフェースコンポーネントを根底のもでrうであるイベント駆動型モデルを用いて作成することを可能にします。すべては組み込まれたチャートオブジェクトやターミナルのイベントに基づています。

開発されたクラスは、以下の方法で使用することができます:
  1. 個別チャートウィンドウでのディスプレイパネル:
  2. エキスパートアドバイザーのためのコントロールパネル:
  3. カスタムディスプレィコントロールパネル

この記事は、あなた独自のディスプレィパネルを個別チャートウィンドウに標準ライブラリを用いていかに簡単に作成できるかを示します。


標準ライブラリは何を提供しているのでしょうか?

標準ライブラリは、以下のすでに出来上がったコントローラを開発者に提供しています。

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>


ディスプレィパネルの作成

まず用語の定義から始めましょう。そのディスプレィパネルは、描画バッファのない個別ウィンドウカスタムディスプレィパネルを表現するための用語です。そのようなパネルは単にターミナルに組み込まれたチャートオブジェクトを用いて必要な情報を表示します。以下が表示される情報です:

必要なステップごとに詳細に見ていき、以下のようなグラフィカルパネルを作成しましょう:

ディスプレィパネルを作成するために、二つのファイルが必要です:

  1. ディスプレィパネルクラスの詳細を含むインクルードファイル
  2. インジケーターソースコードファイル

MQL5 ウィザードを用いてこれらのファイルのテンプレートを取得します。インジケーターディレクトリ(MQL5\Indicators)に、MyIndicatorsとMyPanelというフォルダを作成してください。フォルダを作成するプロセスは、Helpにて記載されているためこちらでは紹介しません。


クラスの記述

すでにワーク用フォルダを作成しました。"Navigator"ウィンドウを見つけ、右クリックしてください。表示したメニューの"New File"を選択します。そして、その中から"New Class" を選び、"Next >"をクリックします。以下のクラスの記述のダイアログを完成させてください。

MQLウィザードにて新しいクラスを作成する

"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つのダイアログが完成されます。

最初のものは、インジケーター名を明記する必要があります:

MQL ウィザードにて新しいインジケーターを作成する

2番目のダイアログにて、"OnChartEvent" (必要)と "OnTimer"にチェックをつけてください:

MQLウィザードのカスタムインジケーターのためのイベントハンドラを設定する

"Separate Window Indicator" (必要) を3番目のダイアログにてチェックをつけてください:

MQLウィザードにてインジケーター描画プロパティを設定する

そして、"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)
  {
//---
   
  }
//+------------------------------------------------------------------+

テンプレートは以下を追加することで完成します:

すでに出来上がったインジケータを取得しました。

//+------------------------------------------------------------------+
//|                                               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つの質問に対する答えを決めなければなりません。

  1. どのような情報を表示したいか?
  2. どのような追加のディスプレィ要素とコントロールがダイアログに配置される必要があるか?
  3. これらの追加の要素/コントールはどのように連携するか?

別の重要な要因は、ダイアログが視覚的に見えやすいか、ユーザーに優しい設計かという点です。ダイアログの機能性に影響しませんが、そのMQL5プログラムのユーザーを大切にしていることを示します。

ステップ1. どのような情報を表示したいか?

この記事は学習ツールを提供しているので、インジケーターの使用しやすさについて塾講してみあしょう。色は、3つのパラメーターの機能として表示されます。そのパラメーターを過度に複雑化してはいけません - これらは”赤”、”緑”、”青”の3色のみです。

そのパラメーター値は、以下のように設定されます:

これらの値はインジケーターでも表示されます。

ステップ2. 追加のコントロールは何が必要ですか?

  1. カラーは、"パネル"コントロールを用いて表示されます。
  2. "赤"と"緑"は、”Edit”コントロールを用いて"読み取り専用"モードにて表示されます。
  3. "青"は、Spin Edit””コントロールによって管理されます。同じコントロールが値の表示に使用されます。
  4. "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)がこの目的に最も適しています。

既に定義された定数によっていくつかの利点が提供されています:

以下の定数の使用が推奨されています:

//+------------------------------------------------------------------+
//| 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(...)メソッドに挿入されますが、読まれない大きな”塊”を得るリスクがあります。

したがって、その作成プロセスはメソッドによって示された部分に分類されます:

これらのメソッドは、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);
  }

二つの意味合いがあります:

  1. そのコントロールは、関連する座標にて作成されます。つまり、その相対位置は、コントロールが作成後追加される根底なの上左角に相対的に配置されます。
  2. その作成の後、Add(...)メソッドを用いてコンテナにコントロールを追加する必要があります。この場合、そのダイアログはコンテナとして機能します。


パラメーターの変更

カラーパネルの色を変化するため、SetColor(void)メソッドを追加します;

パラメーターを外部で変更できるようにするため、3つのパブリックメソッドを追加します:

その「変化をインジケーターに表示する」という部分は、カラーレベルの新しい値を一致するコントロールに数値で表示させ、カラーパネルの色を変化させるという意味です。

以下は、その例としてメソッドのコードを記載しています:

//+------------------------------------------------------------------+
//| 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)

このコードは一見わかりにくいですが、以下の事を行っています:


結論

この記事にて、標準ライブラリクラスを用いてディスプレィパネルを作成するプロセスをご覧いただきました。

作成されたインジケーターを用いることはないかもしれませんが、不必要な情報ばかりではなく、作成時のプロセスの特徴をカバーしました。

より複雑な標準デリバリの例はターミナルの以下のディレクトリにてご覧になれます: