記事"グラフィカルインタフェース II: 区切り線とコンテキストメニュー要素(チャプター 2)"についてのディスカッション

 

新しい記事 グラフィカルインタフェース II: 区切り線とコンテキストメニュー要素(チャプター 2) はパブリッシュされました:

本稿では、区切り線要素を作成します。区切り線要素は、独立したインターフェース要素としてだけでなく、他の多くの構成要素の一部として使用することもできます。本稿ではまた、その後、コンテキストメニュークラスの開発に必要なものすべての詳細を考察します。それに加え、アプリケーションのすべてのグラフィカル・インターフェース要素へのポインタ格納の基本であるクラスに必要なすべての追加をご紹介します。

シリーズ第一弾のグラフィカルインタフェース I: ライブラリストラクチャの準備(チャプター 1)ではライブラリの目的を詳細に考察されます。

区切り線作成クラスの開発

多くの場合、コンテキストメニューでは、異なるタイプのメニュー項目のほかに1つのインターフェース要素が存在します。それが区切り線です。この要素はコンテキストメニュー以外にも存在することがあります。例としてMetaTrader取引端末のステータスバーとMetaEditorコードエディタには縦の区切り線があります。これが、このオブジェクトが他のコントロールに使用されたりグラフィカルインタフェースの別個の要素として使用することができるように別のクラスを作成する理由です。

ボリュームの錯覚を与えるためには、区切り線は、少なくとも2つの部分から構成されなければなりません。1本の線が背景よりも明るく、他方が暗い場合、これは、表面上の溝の視覚効果を作成します。区切り線の作成には2つの方法があります。(1)Objects.mqhファイルに既存する2つのCRectLabel型のプリミティブオブジェクト。または (2) OBJ_BITMAP_LABEL型のオブジェクトの作成と描画キャンパスとしての使用。2番目のオプションを使用してみましょう。標準ライブラリは、描画にはCCanvasクラスを使用するよう推薦します。このクラスには、既に設計の実装を大幅に簡素化し時間を節約する、単純な幾何学図形を描画するために必要なすべてのメソッドが既に含まれています。 

CCanvasクラスは、やはりObjects.mqhファイルに存在するプリミティブオブジェクトと似た使い方ができるように組み込まれなければなりません。これはCCanvasクラスをCChartObjectBmpLabelクラスの継承とすることで簡単にできます。後のプログラムのコンパイル時にはエラーや警告がないようにCCanvas クラスのコードには小規模の変更を導入しなくてはなりません。これは、CChartObjectBmpLabel クラスの基本クラスであるCCanvasクラスとCChartObjectクラス両方にm_chart_id フィールド(変数)があるからです。その結果、コンパイラは、このような名前の変数がすでに存在していると警告を与えます。

図1。そのような名前の変数がすでに存在しているというコンパイラからの警告

作者: Anatoli Kazharski

 
アクション/コマンドを異なるコントロールにバインド/委譲するメカニズムはありますか?例えば、ツールバーのボタンとコンテキストメニューの 項目など。command "パターンがこれに適しているでしょう。同時に、実行されたコマンドの履歴を保存したり、受信者の初期値を保存したりすることで、Undo/Redoメカニズムを実装することも可能である。

また、このコントロールやあのコントロール(パターン・オブザーバー)によってリッスンされるモデルの概念を導入するのも良いだろう。

例えば、チャートモデルがユーザーによって初期化されない限り、チャート管理に関連するすべてのコントロールは無効化ビューを持つ。これによって、ある場合にはコントロールとその振る舞いを担当するロジックに直接アクセスする必要がなくなります。
 
Igor Volodin:
アクション/コマンドを異なるコントロールにバインド/委譲するメカニズムはありますか?例えば、ツールバーのボタンとコンテキストメニューの項目など。command "パターンがこれに適しているでしょう。同時に、実行されたコマンドの履歴を保存したり、受信者の初期値を保存したりすることで、Undo/Redoメカニズムを実装することも可能である。 また、このコントロールやあのコントロール(パターン・オブザーバー)によってリッスンされるモデルの概念を導入するのも良いだろう。 例えば、チャートモデルがユーザーによって初期化されない限り、チャート管理に関連するすべてのコントロールは無効化ビューを持つ。これによって、コントロールとその振る舞いのロジックに直接アクセスする必要がなくなります。



現在のバージョンのライブラリでは、エレメント間のコマンドのやり取りがカスタム・イベントによって 実装されている場合があります。次の記事で詳しく説明する。

追加メカニズムについては、すべて交渉の余地がある。シリーズ全体が公開された後で、スキームの全項目に目を通し、何を変更または追加すべきか、なぜその方が良いのか/信頼できるのか/便利なのか等の議論があれば、リストを作成することができます。

私は質問を誤解しているかもしれない。それなら、具体的に何を手に入れる必要があるのか、それはどのようなものなのかを明確にする必要がある。

 
なぜ変数の配列なのか?
color             m_area_color_array[];
また、CContextMenu()のコンストラクタでは、m_item_Ysize変数をデフォルトで0より大きいサイズに設定する必要がある。