記事"パネルを改善してみましょう(CAppDialog / CWndClientからの継承、背景の色の変更、透明性の追加)"についてのディスカッション

 

新しい記事 パネルを改善してみましょう(CAppDialog / CWndClientからの継承、背景の色の変更、透明性の追加) はパブリッシュされました:

CAppDialogの使用の学習を続けます。ここでは、グラフィックパネルの背景の色、枠線、タイトルを設定する方法を学びます。順を追って、チャート上でアプリケーションウィンドウを移動するときに、アプリケーションウィンドウに透明性を追加する方法を見ていきます。次に、CAppDialogまたはCWndClientから子孫を作成し、コントロールを操作する際の新しい特徴を見ていきます。最後に、新しいプロジェクトを新しい視点から見ていきます。

上記の例のパネルにボタンを追加すると、結果は次のようになります。

Live panel and Button

ご覧のように、パネルを移動すると透明になりますが、追加されたコントロール(ボタン)は不透明のままです。ここでは、移動時にパネルが透明な背景であればいい場合や、ボタンも一緒に透明になった方がいい場合など、好みによったコードの作成方法があります。2つ目の選択肢を取り上げて、パネルを動かすときにボタンも透明にしましょう。

作者: Vladimir Karputov

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

記事 "任意の複雑さのグラフィカルパネルの作成方法とその仕組み "についての議論

ラシッド・ウマロフ, 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フォルダに解凍してください。

ファイル:
 

ビデオでは、ダブルクリック・イベントはパネル上でのみ発生することを示しています。パネルの外では、イベントは捕捉されません。

ファイル:
 
パネルをマウスに対して不透明にすることは可能だろうか。エディット・フィールドでドラッグしたり編集したりすると、チャート上のオブジェクトがまとわりつき、ドラッグが止まってしまう。
 
Photic:
パネルをマウスに対して不透明にすることは可能だろうか。編集フィールドでドラッグして編集するときでさえ、グラフィック内のオブジェクトがまとわりつき、ドラッグが止まってしまう。

さらに。このようにストップやテイクアウトが引っかかることが非常に多い。

編集のために線が選択されていなければ、パネルを動かしても引っかからない。

さらに......パネル・ウィンドウ自体に現在の情報(例えば、買いまたは売りのオープン時の利益や、変化する現在の情報)を出力する方法を知っているとクールでしょう?

誰かが似たようなことをやっているかもしれません。MT4。

 
Vyacheslav Nekipelov:

***

そしてもう一つ......パネルウィンドウ自体に現在の情報(例えば、買いまたは売りのオープン時の利益や、変化する現在の情報)を出力する方法を知っているとクールでしょう?

多分、誰かが似たようなことをやっていると思います。MT4。

パネルに何でも出力できます - 出力を担当する新しいメソッドを書くだけです。

しかし、古いターミナルでは面白くない。

以下は、ポジションに関する情報を表示するパネルの例です: https://www.mql5.com/ru/code/16931.
 
Vladimir Karputov:
位置情報を表示するパネルの例です。https://www.mql5.com/ja/code/16931

ありがとうございました。

 
とても良い記事だ!
 

ウラジミール、今回と前回の記事をありがとう。私にとって新しい有益な点をいくつか学ぶことができました。

ヘッダーの色と閉じるボタンが一緒に表示されるのは初めてですが、最小化/折りたたみ解除後に色の変化がコントロールに 影響しなくなるのはなぜですか?


 
Vasiliy Pushkaryov:

ウラジミール、今回と前回の記事をありがとう。自分自身にとって有益なポイントを新たに学ぶことができた。

ヘッダーの色と閉じるボタンが一緒に表示されるのは初めてですが、最小化/折りたたみ解除後に色の変化がコントロールに影響しなくなるのはなぜですか?


理由がわかりました。最初の実行後と最小化/非モデリング後のヘッダーの幅を見てください:

最初の実行後のヘッダーの幅

図1:初回起動後のヘッダー幅


折りたたみ/展開後のヘッダー幅

図2:最小化/折りたたみ解除後のヘッダー幅


 
Vladimir Karputov:

原因がわかりました。最初の実行後と、最小化/修正解除後のヘッダー幅を見てください:


素晴らしい、ありがとう。コードに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);

そうすればすべてうまくいく。

しかし、あなたの許可を得て、新しいビルドのブランチでこの機能について何度か注意喚起します。もしかしたら修正されるかもしれません。