記事"グラフィカルインタフェース I: グラフィカルインタフェースの動画化(チャプター 3"についてのディスカッション

 

新しい記事 グラフィカルインタフェース I: グラフィカルインタフェースの動画化(チャプター 3) はパブリッシュされました:

本稿はグラフィカルインターフェイスに関するシリーズの続きです。シリーズ第一弾のグラフィカルインタフェース I: ライブラリストラクチャの準備(チャプター 1)ではライブラリの目的を詳細に考慮します。第一部の記事へのリンクの完全なリストは各章の終わりにあります。そこではまた、開発の現段階でのライブラリの完全版をダウンロードすることができます。ファイルはアーカイブと同じディレクトリに配置される必要があります。

前回の記事で は、コントロールのフォームクラスの開発に着手しました。本稿では、チャート領域にフォームを移動するためのクラスメソッドを書き入れによってそれを続行 します。その後、このインターフェイスコンポーネントをライブラリコアに統合します。また、カーソルが上をホバリングしたときにフォームコントロールの色 が変わることを保証します。

カーソルが上をホバリングしたときのインターフェイスコンポーネント外観の変更

全てのコントロールの基本クラスであるCElementクラスの実装については既に考慮しました。そのメンバの一つとして、カーソルのホバー時にオブジェクトの色を変更するCElement::ChangeObjectColor() メソッドが作成されました。ここで、それを作業に使用するためのメカニズムを作成します。このような機能の追加には、タイマーが必要です。これは、MQL アプリケーションの初期設定では無効になっています。設定された目標に応じたタイマーを有効にするかどうかの決定はアプリケーション開発者に任されていま す。

タイマーを有効にするには、MQL言語には異なる頻度を持つEventSetTimer()ちEventSetMillisecondTimer() の2つの関数があります。一番目の関数では、1秒以上の間隔を設定することができます。カーソルのホバー時のコントロールの外観変更には、1秒間隔は長す ぎるので、これは目的に沿いません。変更は、そのような遅延なしですぐに起こるべきです。ミリ秒単位で測定された間隔でのタイマー設定をサポートするEventSetMillisecondTimer()関数が使用されます。MQLレフェレンスによれば、この関数を使用して設定できる最小間隔は10から16ミリ秒です。これは我々の計画を実現するのに十分です。

図2オブジェクトのマウスカーソルへの反応のためのテスト

図2オブジェクトのマウスカーソルへの反応のためのテスト

作者: Anatoli Kazharski

 
アナトリーコーディングのレベル、クオリティ、すべてが法外で、個人的には最高だ。このとてつもない仕事をありがとう!残りのパートも楽しみにしています!
 

こんにちは、アナトーリ、

グラフィカル・インターフェースを使うことにとても興味があります。しかし、私のアプリケーションでは動作しません。パネルウィンドウが動きません。また、サンプルプログラム "InfoPanel.mq5"(プロパティ Movableをtrueに設定)でも何も起こりません。パネルは表示されますが、移動できません。何が問題なのかおわかりになりますか?(使用環境はWindows10、メタトレーダーは5.0ビルド1340です。)


ローランド

 

皆さん、こんにちは、

前回のPart(4)のソースを入手しました。今はすべてうまくいっています。

ローランド

 

標準ライブラリを使ってマウスの動きを処理する方法は?ExpertsExamplesにあるファイルでテストしました。
.ChartEvent(...)関数だけだとON_MOUSE_FOCUS_SETイベントが処理されません。
.OnEvent(...)関数を使用すると、ON_MOUSE_FOCUS_SETイベントは処理されますが、ウィンドウを動かすことができません。
.ChartEvent()と.OnEvent()の両方の関数を使用すると、ON_MOUSE_FOCUS_SETイベントは処理されますが、インクリメントボタンとデクリメントボタンをクリックすると、1ステップ以上変化してしまいます。


   virtual bool      OnItemFocusSet(const int index);
   //--- 再描画
   bool              Redraw(void);
   bool              RowState(const int index,const bool select);
   bool              CheckView(void);
  };
//+------------------------------------------------------------------+
//| チャート・イベントの共通ハンドラ|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CListView)
ON_INDEXED_EVENT(ON_CLICK,m_rows,OnItemClick)
ON_INDEXED_EVENT(ON_MOUSE_FOCUS_SET,m_rows,OnItemFocusSet)
EVENT_MAP_END(CWndClient)
bool CListView::OnItemFocusSet(const int index)
  {
//--- "行 "を選択
   Select(index+m_offset);
//--- 通知を送信する
   EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name);
//--- 処理
   return(true);
  }
 
例題はとても興味深く、個人的な成長に役立つものです。)
質問があります:タイムフレームを変更(再初期化)すると、ブロックが左上隅に飛んでしまいます(x=0, y=0)...ブロックの現在の座標が保存されるように正しく実装するにはどうすればよいでしょうか?

HI: 私の頭の中には2つのバリエーションがあります:
1) 座標をグローバル変数に 書き込む...
2) ファイルに書き込む...
3) この問題に対するあなたの専門的な解決策に興味があります!どのように実装しますか?