EasyAndFastMod/Controls/Pointer.mqh

259 lines
20 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Pointer.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O C:070B5;O :C@A>@0 <KH8 |
//+------------------------------------------------------------------+
class CPointer : public CElement
{
private:
//--- 0@B8=:8 4;O C:070B5;O
string m_file_on;
string m_file_off;
//--- "8? C:070B5;O
ENUM_MOUSE_POINTER m_type;
//--- !>AB>O=85 C:070B5;O
bool m_state;
//---
public:
CPointer(void);
~CPointer(void);
//--- !>740QB O@;K: C:070B5;O
bool CreatePointer(const long chart_id,const int subwin);
//---
private:
bool CreateCanvas(void);
//---
public:
//--- #AB0=>2:0 O@;K:>2 4;O C:070B5;O
void FileOn(const string file_path) { m_file_on=file_path; }
void FileOff(const string file_path) { m_file_off=file_path; }
//--- >72@0I5=85 8 CAB0=>2:0 (1) B8?0 C:070B5;O, (2) A>AB>O=8O C:070B5;O
ENUM_MOUSE_POINTER Type(void) const { return(m_type); }
void Type(ENUM_MOUSE_POINTER type) { m_type=type; }
bool State(void) const { return(m_state); }
void State(const bool state);
//--- 1=>2;5=85 :>>@48=0B
void UpdateX(const int mouse_x) { ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_XDISTANCE,mouse_x-CElementBase::XGap()); }
void UpdateY(const int mouse_y) { ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_YDISTANCE,mouse_y-CElementBase::YGap()); }
//---
public:
//--- 5@5<5I5=85 M;5<5=B0
virtual void Moving(const int mouse_x,const int mouse_y);
//--- #?@02;5=85
virtual void Show(void);
virtual void Hide(void);
virtual void Reset(void);
virtual void Delete(void);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- #AB0=>2:0 :0@B8=>: 4;O C:070B5;O :C@A>@0 <KH8
void SetPointerBmp(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CPointer::CPointer(void) : m_state(true),
m_file_on(""),
m_file_off(""),
m_type(MP_X_RESIZE)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
//--- =0G5=85 8=45:A0 M;5<5=B0 ?> C<>;G0=8N
CElement::Index(0);
//--- @>7@0G=K9 D>=
m_alpha=0;
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CPointer::~CPointer(void)
{
Delete();
}
//+------------------------------------------------------------------+
//| !>740QB C:070B5;L |
//+------------------------------------------------------------------+
bool CPointer::CreatePointer(const long chart_id,const int subwin)
{
//--- !2>9AB20
m_chart_id =chart_id;
m_subwin =subwin;
m_x_size =(m_x_size<1)? 16 : m_x_size;
m_y_size =(m_y_size<1)? 16 : m_y_size;
//--- !>E@0=8BL C:070B5;L =0 A51O
CElement::MainPointer(this);
//--- #AB0=>2:0 :0@B8=>: 4;O C:070B5;O
SetPointerBmp();
//--- !>740QB M;5<5=B
if(!CreateCanvas())
return(false);
//--- !:@KBL M;5<5=B
Hide();
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CPointer::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("pointer");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//--- > C<>;G0=8N >B:;NG5=>
State(false);
return(true);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 A>AB>O=8O C:070B5;O |
//+------------------------------------------------------------------+
void CPointer::State(const bool state)
{
//--- K9B8, 5A;8 ?>2B>@
if(state==m_state)
return;
//--- !>E@0=8BL A>AB>O=85
m_state=state;
//--- !>E@0=8BL 8=45:A 2K1@0==>3> 87>1@065=8O
CElement::ChangeImage(0,CElement::SelectedImage());
//--- 8AC5< :0@B8=:C
Draw();
//--- @8<5=8BL
CElement::Update(true);
}
//+------------------------------------------------------------------+
//| 5@5<5I5=85 M;5<5=B0 |
//+------------------------------------------------------------------+
void CPointer::Moving(const int mouse_x,const int mouse_y)
{
UpdateX(mouse_x);
UpdateY(mouse_y);
}
//+------------------------------------------------------------------+
//| >:07K205B M;5<5=B |
//+------------------------------------------------------------------+
void CPointer::Show(void)
{
//--- K9B8, 5A;8 M;5<5=B C65 2848<
if(CElementBase::IsVisible())
return;
//--- !45;0BL 2848<K<8 2A5 >1J5:BK
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
//--- !>AB>O=85 2848<>AB8
CElementBase::IsVisible(true);
}
//+------------------------------------------------------------------+
//| !:@K205B M;5<5=B |
//+------------------------------------------------------------------+
void CPointer::Hide(void)
{
//--- K9B8, 5A;8 M;5<5=B A:@KB
if(!CElementBase::IsVisible())
return;
//--- !:@KBL >1J5:BK
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS);
//--- !>AB>O=85 2848<>AB8
CElementBase::IsVisible(false);
}
//+------------------------------------------------------------------+
//| 5@5@8A>2:0 |
//+------------------------------------------------------------------+
void CPointer::Reset(void)
{
//--- !:@KBL 8 ?>:070BL
Hide();
Show();
}
//+------------------------------------------------------------------+
//| #40;5=85 |
//+------------------------------------------------------------------+
void CPointer::Delete(void)
{
m_canvas.Destroy();
//--- !>E@0=8BL A>AB>O=85
m_state=true;
//--- !>AB>O=85 2848<>AB8
CElementBase::IsVisible(true);
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CPointer::Draw(void)
{
//--- 0@8A>20BL 704=89 D>=
CElement::DrawBackground();
//--- 0@8A>20BL :0@B8=:C
CElement::DrawImage();
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 :0@B8=>: 4;O C:070B5;O ?> B8?C C:070B5;O |
//+------------------------------------------------------------------+
void CPointer::SetPointerBmp(void)
{
switch(m_type)
{
case MP_X_RESIZE :
m_file_on =(string)RESOURCE_POINTER_X_RS;
m_file_off =(string)RESOURCE_POINTER_X_RS_BLUE;
break;
case MP_Y_RESIZE :
m_file_on =(string)RESOURCE_POINTER_Y_RS;
m_file_off =(string)RESOURCE_POINTER_Y_RS_BLUE;
break;
case MP_XY1_RESIZE :
m_file_on =(string)RESOURCE_POINTER_XY1_RS;
m_file_off =(string)RESOURCE_POINTER_XY1_RS_BLUE;
break;
case MP_XY2_RESIZE :
m_file_on =(string)RESOURCE_POINTER_XY2_RS;
m_file_off =(string)RESOURCE_POINTER_XY2_RS_BLUE;
break;
case MP_WINDOW_RESIZE :
{
CElement::AddImagesGroup(0,0);
CElement::AddImage(0,(string)RESOURCE_POINTER_X_RS);
CElement::AddImage(0,(string)RESOURCE_POINTER_Y_RS);
break;
}
case MP_X_RESIZE_RELATIVE :
m_file_on =(string)RESOURCE_POINTER_X_RS_REL;
m_file_off =(string)RESOURCE_POINTER_X_RS_REL;
break;
case MP_Y_RESIZE_RELATIVE :
m_file_on =(string)RESOURCE_POINTER_Y_RS_REL;
m_file_off =(string)RESOURCE_POINTER_Y_RS_REL;
break;
case MP_X_SCROLL :
m_file_on =(string)RESOURCE_POINTER_X_SCROLL;
m_file_off =(string)RESOURCE_POINTER_X_SCROLL_BLUE;
break;
case MP_Y_SCROLL :
m_file_on =(string)RESOURCE_POINTER_Y_SCROLL;
m_file_off =(string)RESOURCE_POINTER_Y_SCROLL_BLUE;
break;
case MP_TEXT_SELECT :
m_file_on =(string)RESOURCE_POINTER_TEXT_SELECT;
m_file_off =(string)RESOURCE_POINTER_TEXT_SELECT;
break;
}
//--- A;8 C:070= ?>;L7>20B5;LA:89 B8? (MP_CUSTOM)
if(m_type==MP_CUSTOM)
if(m_file_on=="" || m_file_off=="")
::Print(__FUNCTION__," > ;O C:070B5;O :C@A>@0 =C6=> CAB0=>28BL :0@B8=:8!");
//--- #AB0=>28BL :0@B8=:C
if(m_type!=MP_WINDOW_RESIZE)
{
CElement::IconFile((uint)m_file_on);
CElement::IconFileLocked((uint)m_file_off);
}
}
//+------------------------------------------------------------------+