質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

MQL

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

Q&A

解決済

1回答

2633閲覧

同時に発生するオブジェクトのクリック・ドラッグイベントを判別する方法について

buibui80

総合スコア1033

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

MQL

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

0グッド

0クリップ

投稿2021/09/02 05:37

インジケーターにてオブジェクトのクリック・ドラッグイベントをモニタリングした所、

mq4

1void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 2{ 3 if (id == CHARTEVENT_OBJECT_CLICK || id == CHARTEVENT_OBJECT_DRAG) 4 Print( 5 "[click] ", (id == CHARTEVENT_OBJECT_CLICK), " ", 6 "[drag] ", (id == CHARTEVENT_OBJECT_DRAG), " ", 7 "[x, y] ", (int)lparam, ", ", (int)dparam 8 ); 9}

ターミナルに出力されたログは以下の様になりました。

txt

1// 水平線をクリックした時 22021.09.02 14:16:35.506 TestIndicator NZDJPY,M15: [click] true [drag] false [x, y] 467, 72 32021.09.02 14:16:35.506 TestIndicator NZDJPY,M15: [click] false [drag] true [x, y] 0, 0 4 5// 水平線をドラッグした時 62021.09.02 14:25:14.912 TestIndicator NZDJPY,M15: [click] true [drag] false [x, y] 477, 136 72021.09.02 14:25:14.912 TestIndicator NZDJPY,M15: [click] false [drag] true [x, y] 0, 0

同じオブジェクトに対してクリックとドラッグで処理を分けたいのですが、
ログの様に両イベントが同時に発生しておりどちらの操作を行ったのかが判別できません。

質問ですが、
クリックとドラッグのどちらの操作を行ったかを判別する方法はないでしょうか?

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

マウスの左ボタンを押したときの座標と放したときの座標が一致する場合はクリック、
それ以外はドラッグという感じで判定してみました。

基本的には、座標が格納されてくるCHARTEVENT_OBJECT_CLICKだけを使って判定しています。

ただ、チャートの何もないところで左ボタンを押して、オブジェクトの上で放すと
CHARTEVENT_OBJECT_CLICKイベントだけがくるので、ドラッグの判定のために
CHARTEVENT_OBJECT_DRAGが来ていたかどうかも判定しています。

判定ミスとかはあるかもしれません。

MQL4

1int OnInit() 2{ 3 ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, 1); 4 5 return INIT_SUCCEEDED; 6} 7 8bool IsMouseDown(uint state) 9{ 10 return (state & 1) != 0; 11} 12 13void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 14{ 15 static int prevX = INT_MIN; 16 static int prevY = INT_MIN; 17 static bool isDown = false; 18 static bool isDragging = false; 19 20 if (id == CHARTEVENT_OBJECT_DRAG) 21 { 22 isDragging = true; 23 } 24 25 if (id == CHARTEVENT_OBJECT_CLICK) 26 { 27 if (prevX == INT_MIN && prevY == INT_MIN) 28 { 29 //printf("double click"); 30 return; 31 } 32 33 int x = (int)lparam; 34 int y = (int)dparam; 35 36 if (prevX != x || prevY != y) 37 { 38 if (isDragging) 39 { 40 printf("drag prev = (%d, %d), curr = (%d, %d)", prevX, prevY, x, y); 41 } 42 } 43 else 44 { 45 printf("click prev = (%d, %d), curr = (%d, %d)", prevX, prevY, x, y); 46 } 47 48 prevX = INT_MIN; 49 prevY = INT_MIN; 50 isDown = false; 51 isDragging = false; 52 } 53 54 if (id == CHARTEVENT_MOUSE_MOVE) 55 { 56 int x = (int)lparam; 57 int y = (int)dparam; 58 59 if (IsMouseDown((uint)sparam)) 60 { 61 if (!isDown) 62 { 63 //printf("mouse down prev = (%d, %d), curr = (%d, %d)", prevX, prevY, x, y); 64 prevX = x; 65 prevY = y; 66 isDown = true; 67 isDragging = false; 68 } 69 } 70 else 71 { 72 prevX = INT_MIN; 73 prevY = INT_MIN; 74 isDown = false; 75 isDragging = false; 76 } 77 } 78} 79

投稿2021/09/03 18:01

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

buibui80

2021/09/23 02:51

ご回答ありがとうございます、返答が遅れ申し訳ありません。 マウス座標を材料として識別する方法、とても参考になります。 今の所判定ミスは発見していませんが、操作法でカバーすれば問題ないと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問