記事"任意の複雑さのレベルのグラフィカルなパネルを作成する方法"についてのディスカッション

 

新しい記事 任意の複雑さのレベルのグラフィカルなパネルを作成する方法 はパブリッシュされました:

この記事では、CAppDialog クラスに基づいてパネルを作成する方法と、パネルにコントロールを追加する方法について詳しく説明します。 パネルの構造とオブジェクトの継承を示すスキームを提供します。 この記事では、イベントの処理方法、および依存コントロールへの配信方法についても説明します。 その他の例では、サイズや背景色などのパネルパラメータを編集する方法を示します。

標準ライブラリの [パネルとダイアログ] セクションのオブジェクトが作成され、次のオーダーで適用されます。 最初に "Border " オブジェクトが作成され、その中にパネルの背景が "Back " オブジェクトとして追加されます。 次に、クライアント領域 "ClientBack " がバックグラウンドで適用されます。 子コントロールは、クライアント領域内に追加できます。 パネルの名前と2つのコントロールボタンを持つキャプションオブジェクトが、パネルの上部に追加されます。

AppWindow パネルのグラフィカルコントロール

作者: Vladimir Karputov

 

記事をありがとう。とても参考になりました!

 
はい、この記事は役に立ちますが、ON_DBL_CLICKイベントの処理方法がわかりません。
 
Andrii Djola:
はい、この記事は役に立ちますが、ON_DBL_CLICKイベントの処理方法がわかりません。

ダブルクリックは、非常に短い時間間隔で2回クリックすることです。ですから、通常のクリックと同じ方法で処理できます。OnChartEventに スタティック変数を追加するだけですhttps://www.mql5.com/ja/docs/constants/chartconstants/enum_chartevents の例を見て、次のようにしてください:

//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // イベント識別子 
                  const long& lparam,   // ロング・タイプのイベント・パラメータ
                  const double& dparam, // double 型のイベント・パラメータ
                  const string& sparam  // 文字列型のイベント・パラメータ
                  )
  {
//--- 最後にマウスをクリックした時刻
   static uint last_click=0;
//--- チャート上で左クリック
   if(id==CHARTEVENT_CLICK)
     {
      uint click_time=GetTickCount();
      Print(「グラフ上でマウスをクリックした座標: x = ",lparam,"  y = ",dparam);
      if(click_time-last_click<dbl_click_time) 
        {
         Print("DoubleClick!");
         // その他のアクション
        }
      last_click=click_time;
     }
//--- グラフィカル・オブジェクトをマウスでクリックする。
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("という名前のオブジェクトの上でマウスボタンを押す"+sparam+"'");
     }
//--- キーボードのボタンを押す
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch(lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("KEY_NUMLOCK_LEFTが押された");   break;
         case KEY_LEFT:          Print("KEY_LEFTが押された");           break;
         case KEY_NUMLOCK_UP:    Print("KEY_NUMLOCK_UPが押されました");     break;
         case KEY_UP:            Print("KEY_UPが押された");             break;
         case KEY_NUMLOCK_RIGHT: Print("KEY_NUMLOCK_RIGHTが押された");  break;
         case KEY_RIGHT:         Print("KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("KEY_NUMLOCK_DOWNが押された");   break;
         case KEY_DOWN:          Print("KEY_DOWNが押された");           break;
         case KEY_NUMPAD_5:      Print("KEY_NUMPAD_5が押された");       break;
         case KEY_NUMLOCK_5:     Print(「KEY_NUMLOCK_5が押されました。);      break;
         default:                Print("リストにないキーが押されました");
        }
      ChartRedraw();
......
     }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 
Andrii Djola:
はい、この記事は役に立ちますが、ON_DBL_CLICKイベントの処理方法がわかりません。

正しい方法ですべてを行おうとすると、ON_DBL_CLICKイベントをキャッチすることは不可能です。CWnd::OnMouseUpにブレークポイントを置きました:

その結果、パネルをクリックしてもダブルクリックしても、カーソルはブレークポイントに行きません。がっかりだ。

 
Vladimir Karputov:

さて、すべてを正しい方法で行おうとすると、ON_DBL_CLICKイベントをキャッチすることは不可能です。簡単なチェック方法は、パネルとダイアログの セクションにあるサンプルパネルを実行し、CWnd::OnMouseUpでブレークポイントを置くことです:

その結果、パネルをクリックしてもダブルクリックしても、カーソルはブレークポイントに行きません。うっそー。

解決策は別のスレッドhttps://www.mql5.com/ru/forum/239867#comment_7224345。

Обсуждение статьи "Улучшаем работу с Панелями: добавляем прозрачность, меняем цвет фона и наследуемся от CAppDialog/CWndClient"
Обсуждение статьи "Улучшаем работу с Панелями: добавляем прозрачность, меняем цвет фона и наследуемся от CAppDialog/CWndClient"
  • 2018.04.23
  • www.mql5.com
Опубликована статья Улучшаем работу с Панелями: добавляем прозрачность, меняем цвет фона и наследуемся от CAppDialog/CWndClient: Автор: Vladimir Ka...
 
MetaQuotes Software Corp.:

新しい記事「あらゆる複雑なレベルのグラフィカル・パネルを作成する方法」が掲載されました:

著者ウラジーミル・カルプトフ

素晴らしい紹介です!ありがとう
 

これは本当に良い記事だ。とても気に入っている。とてもよく書けている。


ありがとう!

 

このトピックに近づき、あるいは深めるための素晴らしい記事だ。


残念なことに、ビジュアル・ダイアログ・エディターがシステムに欠けているという事実は変わりません。

さらに、ダイアログ内のマウス・イベントは正しくインターセプトされず、マウス・ボタンが押されるとチャートがバックグラウンドで動きます。

また、インジケーターのツールチップはダイアログを通して表示されます。

これはDoerkのコードが修正されたにもかかわらずです。

MetaTrader 5のCWndContainer ライブラリの置き換え https://www.mql5.com/ja/code/13722

Metaquotesはどうしてこれを無視して修正しないほど頑固なのだろう。

Die Ersetzung des CWndContainer
Die Ersetzung des CWndContainer
  • 投票: 24
  • 2016.09.01
  • Doerk Hilger
  • www.mql5.com
Der echte Autor: Original von MetaQuotes Software Corp. Die Modifizierung von Doerk. Diese Datei ersetzt die originale Datei WndContainer.mqh. Eine neue Funktion und zwei kleine Modifikationen verhindern die Veränderung des Charts beim Druck und bei der Haltung der Maus-Taste innerhalb im Bereichs des Containers, das heißt, beim Druck der...
 
Otto Pauser:

このトピックに近づき、あるいは深めるための素晴らしい記事だ。


残念なことに、ビジュアルなダイアログ・エディターがシステムに欠けているという事実は変わらない。

さらに、ダイアログ内のマウス・イベントは正しくインターセプトされず、マウス・ボタンが押されるとチャートがバックグラウンドで動いてしまいます。

また、背後にあるインジケータのツールチップがダイアログを通過してしまいます。

これはDoerkのコードが修正されたにもかかわらずです。

MetaTrader 5用CWndContainerライブラリの置き換え https://www.mql5.com/ja/code/13722

Metaquotesはどうしてこれを無視し、修正しないほど頑固なのでしょうか。

オットー 何があなたを悩ませているのか理解しました。

MT5のグラフィック・ プログラミングでいじりすぎた点があったので、お別れしました。

MQがそこでどんなコンセプトを追求しているのかは知りませんが、彼らは非常に間違った方向に進んでいると思います。

ウィンドウには特別なグラフィックのフレームワークが組み込まれている。

彼らはいつもセキュリティについて話しているので、可能な限りカプセル化している。


データへのAPIを提供し、どの言語を使うかはユーザーに決めさせればいい。それが現代的な方法だろう。


挨拶

 
このクラスは素晴らしいのですが、ウィンドウズのdpiスケーリングが1に設定されているときだけパネルがきれいに見えるため、そのままではアプリケーションに使用できません。
そのため、アプリケーションは自分の画面ではきれいに見えても、他の画面ではそう見えないことがあります。