そんなことが可能なのでしょうか? - ページ 8

 
Vitaly Muzichenko #:

どこかのフォーラムでmql4とmql5上の完全な作業コード

1年ほど前に書きました。

どのスレッドで、あるいはどのように検索するのですか?

 
Andrey Sokolov #:

どのトピックで、あるいはどのように検索 するのですか?

ここで原始的なサイト検索に大きな疑問が、そうでなければ自分で見つけていたはずです。

 
たぶんこれかな
 
Vasiliy Pushkaryov #:
これかな

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

 
Andrey Sokolov #:

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

このスレッドの一番最後の投稿に改訂版とソースがあります。
 
Andrey Sokolov #:

こんにちは、どのようにやったのか見せていただけますか?

スクロールバーのオフセットに等しいオフセットで、配列からデータをスクロールバー・クライアントエリアのラベルに出力します。Scroll Barとして標準ライブラリのCScrollVを使用することができます。Array - すべての項目を含むリスト。ラベル - リストの項目を表示する領域です。そこで何がそんなに複雑なのか......?必要であれば、OOPに精通したプログラマーであれば誰でも可能です。

 
Mihail Matkovskij #:

スクロールバーのオフセットに等しいオフセットで、配列からデータをスクロールバー・クライアントエリアのラベルに出力します。スクロールバーには、標準ライブラリのCScrollVを使用することができます。Array - すべての項目を含むリスト。ラベル - リストの項目を表示するエリアです。そこで何がそんなに複雑なのか......?必要であれば、OOPに精通したプログラマーであれば、誰でもできる。

SBからのスクロールに対応しましたか?なんとなくクライアントパネルを使わず、チャート上で個別に動作させることができませんでした。質問があれば、使い方を聞くかもしれません。

トレーディング、自動売買システム、ストラテジーテスターに関するフォーラム

任意の複雑なグラフィックパネルの作成方法とその機能」。

ヴァシリー・プシュカリョフ, 2021.12.21 10:12

パネルへのリンクがない、チャート上だけの縦スクロールバーを作ろうとしているのですが、うまくいきません。

例えば、チェックボックスの場合、マウスをクリックすると反応するようにします。チェックボックスが表示されたり消えたりします。

#include <Controls\CheckBox.mqh>
CCheckBox Chbox;
//+------------------------------------------------------------------+
void OnInit()
{
  Chbox.Create(0, "MyCheckBox", 0, 20, 20, 100, 40);
  ChartRedraw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Chbox.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+


しかし、縦スクロールの 場合、マウスのクリックに反応しない。

#include <Controls\Scrolls.mqh>
CScrollV Scroll;

void OnInit()
{
  Scroll.Create(0, "MyScrollV", 0, 20, 20, 40, 200);
  ChartRedraw();
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Scroll.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+

この複合要素をチャート上で動作させる方法をご存知の方、アドバイスをお願いします。


 
Vasiliy Pushkaryov #:

SBからのスクロールに対応しましたか?なぜか、クライアントパネルを使わずに、チャート上で個別に動作させることができませんでした。手伝ってくれるかな?


そこには、いろいろなニュアンスが込められています。チェックボックスはOBJ_BITMAP_LABELなので(視覚的に)機能し、そのStateはターミナルで変更されます。このクリックは、OnChartEventで他のBitmapラベルのクリックと同様に追跡することができます。しかし、標準ライブラリは、カスタムイベントをベースにした独自のイベントモデルを持っています。CAppDialogに CScrollVコンポーネントが追加されていれば、CArrayObj CWndContainer::m_controls を列挙し、void CAppDialog::ChartEvent で生成されます。この場合、ON_CLICK, ON_DRAG_START, ON_DRAG_PROCESS, ON_DRAG_ENDなどのイベントが発生 します。 あなたの場合、CAppDialogにコンポーネントが追加されていないので、イベントは発生しません。この仕組みを回避して、CAppDialogを使わずにカスタムイベントを強制的に発生させる方法については考えていません。もっと詳しくソースコードを解析する必要がありますね。

CWndContainerクラスをベースにしたコンポーネントを作成してみてください。そして、それに要素を加える。そこには(CDialogやCAppDialogのような)視覚的な要素はありませんが、UI要素の正しい操作に必要な機構はすべて存在します。
 
Mihail Matkovskij #:

そこには、いろいろなニュアンスが込められています。OnCheckBoxのtickはOBJ_BITMAP_LABELなので(視覚的に)動作し、そのStateはターミナルによって変更されます。そのクリックはOnChartEventでBitmapラベルのクリックと同様に追跡できます。しかし、標準ライブラリは、カスタムイベントをベースにした独自のイベントモデルを持っています。CAppDialogに CScrollVコンポーネントが追加されていれば、CArrayObj CWndContainer::m_controls を列挙し、void CAppDialog::ChartEvent で生成されます。この場合、ON_CLICK, ON_DRAG_START, ON_DRAG_PROCESS, ON_DRAG_ENDなどのイベントが発生 します。 あなたの場合、CAppDialogにコンポーネントが追加されていないので、イベントは発生しません。この仕組みを回避して、CAppDialogを使わずにカスタムイベントを強制的に発生させる方法については考えていません。もっと詳しくソースコードを解析する必要がありますね。

CWndContainerクラスをベースにしたコンポーネントを作成してみる。そして、それに要素を加える。そこには(CDialogやCAppDialogのような)視覚的な要素はありませんが、UI要素の正しい操作に必要なメカニズムは全て存在します。
CAppDialogの仕組みを説明し、コンテナに入れることを提案していただき、ありがとうございました。時間があるときに、実験してみようと思います。