MQL4 のパネル(CAppDialog)にチェックボックスを置き、ユーザーがチェックを入れたか・外したかを取得する方法です。1つだけなら CCheckBox の Checked()、複数をまとめて扱うなら CCheckGroup の Value() を使います。
使うメソッドの早見表
| クラス | メソッド | できること |
| CCheckBox | Checked() | チェック状態を取得(true / false) |
| CCheckBox | Checked(true / false) | チェック状態をプログラムから切り替える |
| CCheckGroup | AddItem(テキスト, 値) | チェックボックスを1つ追加し、値を割り当てる |
| CCheckGroup | Value() | チェックされた項目の値の合計を取得 |
| CCheckGroup | Check(番号, 値) | 指定した項目をプログラムからチェック済みにする |
CheckBox のチェック状態は Checked() で取得する
CheckBox.mqh(MQL4\Include\Controls\CheckBox.mqh)には、次の2つの Checked() が用意されています。
|
1 2 3 |
//--- state bool Checked(void) const { return(m_button.Pressed()); } bool Checked(const bool flag) { return(m_button.Pressed(flag)); } |
引数なしの Checked() は、チェックが入っていれば true、外れていれば false を返します。引数ありの Checked(true) / Checked(false) は、チェック状態をプログラムから切り替えるときに使います。
Event Handler でチェックの変化を受け取る
チェックボックスを1つ置いたパネルを作り、クリックされるたびに表示を「Checked」「UnChecked」に切り替えます。大まかな流れは次の3ステップです。
- CheckBox.mqh をインクルード
パネル本体の Dialog.mqh と、Controls\CheckBox.mqh を読み込みます - カスタムクラスを定義
CAppDialog を継承した CTestPanel クラスを作り、CreateCheckBox() でチェックボックスを配置します。イベントマップ(EVENT_MAP_BEGIN~EVENT_MAP_END)で、チェックが変わったとき(ON_CHANGE)に OnChangeCheckBox() が呼ばれるようにします - オブジェクトを作って実行
CTestPanel のインスタンス TPanel を作り、OnInit() で Create() と Run() を実行します
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <Controls\Dialog.mqh> #include <Controls\CheckBox.mqh> class CTestPanel : public CAppDialog{ private: CCheckBox tCBox; public: CTestPanel(void){}; ~CTestPanel(void){}; //--- create virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); protected: bool CreateCheckBox(void); void OnChangeCheckBox(void); }; // Event Handler EVENT_MAP_BEGIN(CTestPanel) ON_EVENT(ON_CHANGE, tCBox, OnChangeCheckBox) EVENT_MAP_END(CAppDialog) bool CTestPanel::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2){ if(!CAppDialog::Create(chart, name, subwin, x1, y1, x2, y2)) return(false); if(!CreateCheckBox()) return(false); return(true); } bool CTestPanel::CreateCheckBox(void){ if(!tCBox.Create(m_chart_id, m_name+"CheckBox01", m_subwin, 45, 26, 145, 46)) return(false); if(!tCBox.Color(clrBlue)) return(false); if(!tCBox.Text("Check Box")) return(false); if(!Add(tCBox)) return(false); return(true); } // チェックが変わるたびに呼ばれる void CTestPanel::OnChangeCheckBox(void){ if(tCBox.Checked()){ tCBox.Text("Checked"); } else{ tCBox.Text("UnChecked"); } } CTestPanel TPanel; int OnInit(){ if(!TPanel.Create( ChartID(), "TestPanel", 0, 160, 40, 360, 210 )){ return(INIT_FAILED); } TPanel.Run(); return(INIT_SUCCEEDED); } void OnDeinit(const int reason){ TPanel.Destroy(reason); } void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam ){ TPanel.ChartEvent(id, lparam, dparam, sparam); } |
チェックを入れると、表示が「Checked」に変わります。

チェックを外すと「UnChecked」になります。

CCheckGroup で複数のチェックボックスをまとめる
CCheckGroup を使うと、複数の CCheckBox を1つのグループとして扱えます。CheckGroup.mqh の中で CheckBox.mqh も読み込まれているので、インクルードは CheckGroup.mqh だけで足ります。
AddItem() で項目を追加するとき、ビット演算の左シフト(1<<i)で各項目に 1・2・4 の値を割り当てます。チェックされた項目の値の合計が Value() で取得できるので、ここでは Comment() でチャートに表示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <Controls\Dialog.mqh> #include <Controls\CheckGroup.mqh> class CTestPanel : public CAppDialog{ private: CCheckGroup tCheckGroup; public: CTestPanel(void){}; ~CTestPanel(void){}; //--- create virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); protected: bool CreateCheckGroup(void); void OnChangeCheckGroup(void); }; // Event Handler EVENT_MAP_BEGIN(CTestPanel) ON_EVENT(ON_CHANGE, tCheckGroup, OnChangeCheckGroup) EVENT_MAP_END(CAppDialog) bool CTestPanel::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2){ if(!CAppDialog::Create(chart, name, subwin, x1, y1, x2, y2)) return(false); if(!CreateCheckGroup()) return(false); return(true); } bool CTestPanel::CreateCheckGroup(void){ if(!tCheckGroup.Create(m_chart_id, m_name+"CheckGroup", m_subwin, 45, 26, 145, 86)) return(false); if(!Add(tCheckGroup)) return(false); // 各項目に 1, 2, 4 の値を割り当てる for(int i=0; i<3; i++){ if(!tCheckGroup.AddItem("CheckBox_"+IntegerToString(i), 1<<i)) return(false); } Comment("CheckGroup = "+IntegerToString(tCheckGroup.Value())); return(true); } // チェックが変わるたびに呼ばれる void CTestPanel::OnChangeCheckGroup(void){ Comment("CheckGroup = "+IntegerToString(tCheckGroup.Value())); } CTestPanel TPanel; int OnInit(){ if(!TPanel.Create( ChartID(), "TestPanel", 0, 160, 40, 360, 210 )){ return(INIT_FAILED); } TPanel.Run(); return(INIT_SUCCEEDED); } void OnDeinit(const int reason){ TPanel.Destroy(reason); Comment(""); // チャートのコメントを消す } void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam ){ TPanel.ChartEvent(id, lparam, dparam, sparam); } |
CheckBox_0 と CheckBox_1 にチェックを入れると、1 + 2 = 3 が表示されます。

| チェックボックス | 割り当てる値 | 2進数 | 10進数 |
| CheckBox_0 | 1<<0 | 0001 | 1 |
| CheckBox_1 | 1<<1 | 0010 | 2 |
| CheckBox_2 | 1<<2 | 0100 | 4 |
2進数で見ると、各項目が別々の桁を使っているので、合計値からどれにチェックが入っているかを判別できます。3つすべてにチェックを入れると 1 + 2 + 4 = 7 です。
どの項目にチェックが入っているかを判定する
合計値から個々の状態を取り出すには、ビット演算の AND(&)を使います。「値 & (1<<i)」が 0 でなければ、i 番目の項目にチェックが入っています。
上のコードの OnChangeCheckGroup() を次のように差し替えると、各項目の ON / OFF をチャートに表示できます。
|
1 2 3 4 5 6 7 8 9 10 |
void CTestPanel::OnChangeCheckGroup(void){ long value = tCheckGroup.Value(); string msg = "CheckGroup = " + IntegerToString(value); for(int i=0; i<3; i++){ bool on = ((value & (1<<i)) != 0); msg += "\nCheckBox_" + IntegerToString(i) + (on ? " : ON" : " : OFF"); } Comment(msg); } |
起動時に特定の項目へチェックを入れておきたい場合は、CreateCheckGroup() の for ループのあと、Comment() の前で Check(番号, 値) を呼びます。
|
1 2 3 4 5 |
for(int i=0; i<3; i++){ if(!tCheckGroup.AddItem("CheckBox_"+IntegerToString(i), 1<<i)) return(false); } tCheckGroup.Check(0, 1<<0); // CheckBox_0 を最初からチェック済みにする Comment("CheckGroup = "+IntegerToString(tCheckGroup.Value())); |




















