記事 "任意の複雑さのグラフィカルパネルの作成方法とその仕組み "についての議論
ラシッド・ウマロフ, 2018.04.23 10:30 AM
ダブルクリックは、その間の時間間隔が非常に小さい2回のクリックです。そのため、通常のクリックと同じ方法で処理できます。OnChartEventに 静的変数を追加するだけです。https://www.mql5.com/ja/docs/constants/chartconstants/enum_chartevents の例を見て、次のようにしてください:
....
パネルにダブルクリック処理を追加する方法を例で示しましょう。CMyWndClientクラスを編集しましょう。
1. CWndの 祖先にある仮想メソッドOnDblClickをオーバーライドする。
class CMyWndClient : public CWndClient { private: CButton m_button1; // ボタンオブジェクト CButton m_button2; // ボタンオブジェクト //--- スクロールサイズ int m_scroll_size; // スクロールサイズ //--- 所有者を保存する CAppDialog m_owner; // オーナー //--- 見えないものを隠す bool m_hide_invisble; //--- bool AddButton1(void); bool AddButton2(void); protected: //--- 従属コントロールのイベントのハンドラ void OnClickButton1(void); void OnClickButton2(void); void OnShowScrollH(void); virtual bool OnScrollLineRight(void); virtual bool OnScrollLineLeft(void); virtual bool OnDblClick(void); ..... //+------------------------------------------------------------------+ //|| OnDblClickイベントの処理をオーバーライドする。 //+------------------------------------------------------------------+ bool CMyWndClient::OnDblClick(void) { Print(__FUNCTION__); return ColorBackground(GetRandomColor()); }
2.このイベントの処理を追加する。
//+------------------------------------------------------------------+ //| イベントハンドリング| //+------------------------------------------------------------------+ EVENT_MAP_BEGIN(CMyWndClient) ON_EVENT(ON_CLICK,m_button1,OnClickButton1) ON_EVENT(ON_CLICK,m_button2,OnClickButton2) ON_EVENT(ON_DBL_CLICK,this,OnDblClick) ON_EVENT(ON_SHOW,m_scroll_h,OnShowScrollH) EVENT_MAP_END(CWndClient)
3.MyWndClient.mq5アプリケーション・ファイルに、DoubleClickイベントをキャッチするための行を 追加します。
//+------------------------------------------------------------------+ //| チャートイベント機能| //+------------------------------------------------------------------+ void OnChartEvent(const int id, // イベントID const long& lparam, // ロング・タイプのイベント・パラメーター const double& dparam, // double型のイベントパラメータ const string& sparam) // 文字列型のイベント・パラメーター { //--- 最後にマウスをクリックした時刻 static uint last_click=0; //--- チャート上で左クリック if(id==CHARTEVENT_OBJECT_CLICK) { uint click_time=GetTickCount(); //Print("click_time=",click_time); //チャート上のマウスクリックの座標: x = ",lparam," y = ",dparam); if(click_time-last_click<dbl_click_time) { PrintFormat("DoubleClick! time=%d msec",click_time-last_click); // ON_DBL_CLICKイベントをクライアント領域に送信する。 EventChartCustom(CONTROLS_SELF_MESSAGE,ON_DBL_CLICK,ClientArea.Id(),dparam,ClientArea.Name()); } last_click=click_time; //--- } AppWindow.ChartEvent(id,lparam,dparam,sparam); }
クリック間の時間をミリ秒単位でアプリケーションの外部パラメータに追加します。
//+------------------------------------------------------------------+ //|MyWndClient.mq5 //| Copyright 2018, MetaQuotes Software Corp. //|https://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.001" #property description "CMyWndClientクラスをベースにしたMyWndClientアプリケーション" #property description "背景色とヘッダー色を設定するボタンを追加" #include "MyWndClient.mqh" #include <Controls\Dialog.mqh> #include <Controls\Button.mqh> //--- 入力パラメータ input bool InpTwoButtonsVisible=false; // パネルの幅 input bool HideInvisble=false; // 見えないものを隠す input uint dbl_click_time=500; // クリックの間隔(ミリ秒
ファイルが添付されています。個別に表示するか、アーカイブをMQL5/Expertsフォルダに解凍してください。
ビデオでは、ダブルクリック・イベントはパネル上でのみ発生することを示しています。パネルの外では、イベントは捕捉されません。

パネルをマウスに対して不透明にすることは可能だろうか。編集フィールドでドラッグして編集するときでさえ、グラフィック内のオブジェクトがまとわりつき、ドラッグが止まってしまう。
さらに。このようにストップやテイクアウトが引っかかることが非常に多い。
編集のために線が選択されていなければ、パネルを動かしても引っかからない。
さらに......パネル・ウィンドウ自体に現在の情報(例えば、買いまたは売りのオープン時の利益や、変化する現在の情報)を出力する方法を知っているとクールでしょう?
誰かが似たようなことをやっているかもしれません。MT4。
***
そしてもう一つ......パネルウィンドウ自体に現在の情報(例えば、買いまたは売りのオープン時の利益や、変化する現在の情報)を出力する方法を知っているとクールでしょう?
多分、誰かが似たようなことをやっていると思います。MT4。
ありがとうございました。
ウラジミール、今回と前回の記事をありがとう。自分自身にとって有益なポイントを新たに学ぶことができた。
ヘッダーの色と閉じるボタンが一緒に表示されるのは初めてですが、最小化/折りたたみ解除後に色の変化がコントロールに影響しなくなるのはなぜですか?
理由がわかりました。最初の実行後と最小化/非モデリング後のヘッダーの幅を見てください:
図1:初回起動後のヘッダー幅
図2:最小化/折りたたみ解除後のヘッダー幅
原因がわかりました。最初の実行後と、最小化/修正解除後のヘッダー幅を見てください:
素晴らしい、ありがとう。コードに1行追加したところ、ボタンをクリックするとヘッダーが完全に着色されるようになった。
//+------------------------------------------------------------------+ //| イベントハンドラ| //+------------------------------------------------------------------+ void CLivePaneButtonClicks::OnClickButton2(void) { string prefix=Name(); int total=ExtDialog.ControlsTotal(); for(int i=0;i<total;i++) { CWnd*obj=ExtDialog.Control(i); string name=obj.Name(); //--- if(name==prefix+"Caption") { CEdit *edit=(CEdit*) obj; color clr=(color)GETRGB(XRGB(rand()%255,rand()%255,rand()%255)); edit.ColorBackground(clr); edit.Width(336); ChartRedraw(); return; } } }
あとは、関数でこの点をオーバーライドするだけだ。
virtual void Minimize(void);
virtual void Maximize(void);
そうすればすべてうまくいく。
しかし、あなたの許可を得て、新しいビルドのブランチでこの機能について何度か注意喚起します。もしかしたら修正されるかもしれません。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 パネルを改善してみましょう(CAppDialog / CWndClientからの継承、背景の色の変更、透明性の追加) はパブリッシュされました:
CAppDialogの使用の学習を続けます。ここでは、グラフィックパネルの背景の色、枠線、タイトルを設定する方法を学びます。順を追って、チャート上でアプリケーションウィンドウを移動するときに、アプリケーションウィンドウに透明性を追加する方法を見ていきます。次に、CAppDialogまたはCWndClientから子孫を作成し、コントロールを操作する際の新しい特徴を見ていきます。最後に、新しいプロジェクトを新しい視点から見ていきます。
上記の例のパネルにボタンを追加すると、結果は次のようになります。
ご覧のように、パネルを移動すると透明になりますが、追加されたコントロール(ボタン)は不透明のままです。ここでは、移動時にパネルが透明な背景であればいい場合や、ボタンも一緒に透明になった方がいい場合など、好みによったコードの作成方法があります。2つ目の選択肢を取り上げて、パネルを動かすときにボタンも透明にしましょう。
作者: Vladimir Karputov