EasyAndFastMod/Mouse.mqh

165 líneas
15 KiB
MQL5

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Mouse.mqh |
//| Copyright 2016, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "Defines.mqh"
#include "Objects.mqh"
#include <Charts\Chart.mqh>
//+------------------------------------------------------------------+
//| ;0AA 4;O ?>;CG5=8O ?0@0<5B@>2 <KH8 |
//+------------------------------------------------------------------+
class CMouse
{
private:
//--- -:75<?;O@ :;0AA0 4;O C?@02;5=8O 3@0D8:><
CChart m_chart;
//--- >>@48=0BK
int m_x;
int m_y;
//--- ><5@ >:=0, 2 :>B>@>< =0E>48BAO :C@A>@
int m_subwin;
//--- @5<O A>>B25BAB2CNI55 :>>@48=0B5 X
datetime m_time;
//--- #@>25=L (F5=0) A>>B25BAB2CNI89 :>>@48=0B5 Y
double m_level;
//--- !>AB>O=85 ;52>9 :=>?:8 <KH8 (7060B0/>B60B0)
bool m_left_button_state;
//--- !GQBG8: 2K7>2>2
ulong m_call_counter;
//--- 0C70 <564C :;8:0<8 ;52>9 :=>?:>9 <KH8 (4;O >?@545;5=8O 42>9=>3> =060B8O)
uint m_pause_between_clicks;
//---
public:
CMouse(void);
~CMouse(void);
//--- 1@01>BG8: A>1KB89
void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- >72@0I05B 01A>;NB=K5 :>>@48=0BK :C@A>@0 <KH8
int X(void) const { return(m_x); }
int Y(void) const { return(m_y); }
//--- (1) >72@0I05B =><5@ >:=0, 2 :>B>@>< =0E>48BAO :C@A>@, (2) 2@5<O A>>B25BAB2CNI55 :>>@48=0B5 X,
// (3) C@>25=L (F5=0) A>>B25BAB2CNI89 :>>@48=0B5 Y
int SubWindowNumber(void) const { return(m_subwin); }
datetime Time(void) const { return(m_time); }
double Level(void) const { return(m_level); }
//--- >72@0I05B A>AB>O=85 ;52>9 :=>?:8 <KH8 (7060B0/>B60B0)
bool LeftButtonState(void) const { return(m_left_button_state); }
//--- >72@0I05B (1) A>E@0=Q==>5 ?@8 ?>A;54=5< 2K7>25 7=0G5=85 AGQBG8:0 (ms) 8
// (2) @07=8FC (ms) <564C 2K7>20<8 >1@01>BG8:0 A>1KB8O ?5@5<5I5=8O :C@A>@0 <KH8
ulong CallCounter(void) const { return(m_call_counter); }
ulong GapBetweenCalls(void) const { return(::GetTickCount()-m_call_counter); }
//--- >72@0I05B >B=>A8B5;L=K5 :>>@48=0BK :C@A>@0 <KH8 >B ?5@540==>3> >1J5:B0-E>;AB0 4;O @8A>20=8O
int RelativeX(CRectCanvas &object);
int RelativeY(CRectCanvas &object);
//---
private:
//--- @>25@:0 87<5=5=8O A>AB>O=8O ;52>9 :=>?:8 <KH8
bool CheckChangeLeftButtonState(const string mouse_state);
//--- @>25@:0 42>9=>3> =060B8O ;52>9 :=>?:8 <KH8
void CheckDoubleClick(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CMouse::CMouse(void) : m_x(0),
m_y(0),
m_subwin(WRONG_VALUE),
m_time(NULL),
m_level(0.0),
m_left_button_state(false),
m_call_counter(::GetTickCount()),
m_pause_between_clicks(300)
{
//--- >;CG8< ID B5:CI53> 3@0D8:0
m_chart.Attach();
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CMouse::~CMouse(void)
{
//--- BA>548=8BLAO >B 3@0D8:0
m_chart.Detach();
}
//+------------------------------------------------------------------+
//| 1@01>B:0 A>1KB89 <KH8 |
//+------------------------------------------------------------------+
void CMouse::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- 1@01>B:0 A>1KB8O ?5@5<5I5=8O :C@A>@0
if(id==CHARTEVENT_MOUSE_MOVE)
{
//--- >>@48=0BK 8 A>AB>O=85 ;52>9 :=>?:8 <KH8
m_x =(int)lparam;
m_y =(int)dparam;
m_left_button_state =CheckChangeLeftButtonState(sparam);
//--- !>E@0=8< 7=0G5=85 AGQBG8:0 2K7>2>2
m_call_counter=::GetTickCount();
//--- >;CG8< <5AB>?>;>65=85 :C@A>@0
if(!::ChartXYToTimePrice(m_chart.ChartId(),m_x,m_y,m_subwin,m_time,m_level))
return;
//--- >;CG8< >B=>A8B5;L=CN :>>@48=0BC Y
if(m_subwin>0)
m_y=m_y-m_chart.SubwindowY(m_subwin);
return;
}
//--- 1@01>B:0 A>1KB8O =060B8O =0 3@0D8:5
if(id==CHARTEVENT_CLICK)
{
//--- @>25@8< 42>9=>5 =060B85 ;52>9 :=>?:>9 <KH8
CheckDoubleClick();
return;
}
}
//+------------------------------------------------------------------+
//| >72@0I05B >B=>A8B5;L=CN X-:>>@48=0BC :C@A>@0 <KH8 |
//| >B ?5@540==>3> >1J5:B0-E>;AB0 4;O @8A>20=8O |
//+------------------------------------------------------------------+
int CMouse::RelativeX(CRectCanvas &object)
{
return(m_x-object.X()+(int)ObjectGetInteger(0,object.ChartObjectName(),OBJPROP_XOFFSET));
}
//+------------------------------------------------------------------+
//| >72@0I05B >B=>A8B5;L=CN Y-:>>@48=0BC :C@A>@0 <KH8 |
//| >B ?5@540==>3> >1J5:B0-E>;AB0 4;O @8A>20=8O |
//+------------------------------------------------------------------+
int CMouse::RelativeY(CRectCanvas &object)
{
return(m_y-object.Y()+(int)ObjectGetInteger(0,object.ChartObjectName(),OBJPROP_YOFFSET));
}
//+------------------------------------------------------------------+
//| @>25@:0 87<5=5=8O A>AB>O=8O ;52>9 :=>?:8 <KH8 |
//+------------------------------------------------------------------+
bool CMouse::CheckChangeLeftButtonState(const string mouse_state)
{
bool left_button_state=(bool)int(mouse_state);
//--- B?@028< A>>1I5=85 >1 87<5=5=88 A>AB>O=8O ;52>9 :=>?:8 <KH8
if(m_left_button_state!=left_button_state)
::EventChartCustom(m_chart.ChartId(),ON_CHANGE_MOUSE_LEFT_BUTTON,0,0.0,"");
//--- 5@=CBL B5:CI55 A>AB>O=85 ;52>9 :=>?:8 <KH8
return(left_button_state);
}
//+------------------------------------------------------------------+
//| @>25@:0 42>9=>3> =060B8O ;52>9 :=>?:8 <KH8 |
//+------------------------------------------------------------------+
void CMouse::CheckDoubleClick(void)
{
static uint prev_depressed =0;
static uint curr_depressed =::GetTickCount();
//--- 1=>28< 7=0G5=8O
prev_depressed =curr_depressed;
curr_depressed =::GetTickCount();
//--- ?@545;8< 2@5<O <564C =060B8O<8
uint counter = curr_depressed - prev_depressed;
//--- A;8 <564C :;8:0<8 ?@>H;> <5=LH5 2@5<5=8, G5< C:070=>, >B?@028< A>>1I5=85 > 42>9=>< =060B88
if(counter < m_pause_between_clicks)
{
::EventChartCustom(m_chart.ChartId(),ON_DOUBLE_CLICK,counter,0.0,"");
}
}
//+------------------------------------------------------------------+