EasyAndFastMod/Controls/Button.mqh

334 lines
28 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Button.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O :=>?:8 |
//+------------------------------------------------------------------+
class CButton : public CElement
{
private:
//--- 568< 42CE A>AB>O=89 :=>?:8
bool m_two_state;
//---
public:
CButton(void);
~CButton(void);
//--- 5B>4K 4;O A>740=8O :=>?:8
bool CreateButton(const string text,const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const string text,const int x_gap,const int y_gap);
bool CreateCanvas(void);
//---
public:
//--- (1) #AB0=>2:0 @568<0 :=>?:8, (2) A>AB>O=85 :=>?:8 (=060B0/>B60B0)
bool TwoState(void) const { return(m_two_state); }
void TwoState(const bool flag) { m_two_state=flag; }
bool IsPressed(void) const { return(m_is_pressed); }
void IsPressed(const bool state);
//--- #AB0=>2:0 O@;K:>2 4;O :=>?:8 2 =060B>< A>AB>O=88 (4>ABC?5=/701;>:8@>20=)
void IconFilePressed(const string file_path);
void IconFilePressedLocked(const string file_path);
//--- 7<5=5=85 @07<5@>2
void ChangeSize(const uint x_size,const uint y_size);
//---
public:
//--- 1@01>BG8: A>1KB89 3@0D8:0
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
protected:
//--- 8AC5B D>=
virtual void DrawBackground(void);
//--- 8AC5B @0<:C
virtual void DrawBorder(void);
//--- 8AC5B :0@B8=:C
virtual void DrawImage(void);
//---
private:
//--- 1@01>B:0 =060B8O =0 :=>?:5
bool OnClickButton(const string pressed_object);
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CButton::CButton(void) : m_two_state(false)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CButton::~CButton(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>BG8: A>1KB89 |
//+------------------------------------------------------------------+
void CButton::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)
{
//--- 5@5@8A>20BL M;5<5=B, 5A;8 1K;> ?5@5A5G5=85 3@0=8F
if(CElementBase::CheckCrossingBorder())
Update(true);
//---
return;
}
//--- 1@01>B:0 A>1KB8O =060B8O ;52>9 :=>?:8 <KH8 =0 >1J5:B5
if(id==CHARTEVENT_OBJECT_CLICK)
{
if(OnClickButton(sparam))
return;
//---
return;
}
//--- 1@01>B:0 A>1KB8O 87<5=5=8O A>AB>O=8O ;52>9 :=>?:8 <KH8
if(id==CHARTEVENT_CUSTOM+ON_CHANGE_MOUSE_LEFT_BUTTON)
{
if(!CElementBase::MouseFocus())
return;
//--- 5@5@8A>20BL M;5<5=B
Update(true);
return;
}
}
//+------------------------------------------------------------------+
//| !>740QB M;5<5=B |
//+------------------------------------------------------------------+
bool CButton::CreateButton(const string text,const int x_gap,const int y_gap)
{
//--- K9B8, 5A;8 =5B C:070B5;O =0 3;02=K9 M;5<5=B
if(!CElement::CheckMainPointer())
return(false);
//--- =8F80;870F8O A2>9AB2
InitializeProperties(text,x_gap,y_gap);
//--- !>740=85 M;5<5=B0
if(!CButton::CreateCanvas())
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CButton::InitializeProperties(const string text,const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_x_size =(m_x_size<1 || m_auto_xresize_mode)? m_main.X2()-CElementBase::X()-m_auto_xresize_right_offset : m_x_size;
m_y_size =(m_y_size<1)? 20 : m_y_size;
m_label_text =text;
//--- &25B D>=0 ?> C<>;G0=8N
m_back_color =(m_back_color!=clrNONE)? m_back_color : clrGainsboro;
m_back_color_hover =(m_back_color_hover!=clrNONE)? m_back_color_hover : C'229,241,251';
m_back_color_locked =(m_back_color_locked!=clrNONE)? m_back_color_locked : clrLightGray;
m_back_color_pressed =(m_back_color_pressed!=clrNONE)? m_back_color_pressed : C'204,228,247';
//--- &25B @0<:8 ?> C<>;G0=8N
m_border_color =(m_border_color!=clrNONE)? m_border_color : C'150,170,180';
m_border_color_hover =(m_border_color_hover!=clrNONE)? m_border_color_hover : C'0,120,215';
m_border_color_locked =(m_border_color_locked!=clrNONE)? m_border_color_locked : clrDarkGray;
m_border_color_pressed =(m_border_color_pressed!=clrNONE)? m_border_color_pressed : C'0,84,153';
//--- BABC?K 8 F25B B5:AB>2>9 <5B:8 8 :0@B8=:8
m_icon_x_gap =(m_icon_x_gap!=WRONG_VALUE)? m_icon_x_gap : 0;
m_icon_y_gap =(m_icon_y_gap!=WRONG_VALUE)? m_icon_y_gap : 0;
m_label_x_gap =(m_label_x_gap!=WRONG_VALUE)? m_label_x_gap : 24;
m_label_y_gap =(m_label_y_gap!=WRONG_VALUE)? m_label_y_gap : 4;
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack;
m_label_color_hover =(m_label_color_hover!=clrNONE)? m_label_color_hover : clrBlack;
m_label_color_locked =(m_label_color_locked!=clrNONE)? m_label_color_locked : clrGray;
m_label_color_pressed =(m_label_color_pressed!=clrNONE)? m_label_color_pressed : clrBlack;
//--- BABC?K >B :@09=59 B>G:8
CElementBase::XGap(x_gap);
CElementBase::YGap(y_gap);
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CButton::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("button");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 A>AB>O=8O :=>?:8 - =060B0/>B60B0 |
//+------------------------------------------------------------------+
void CButton::IsPressed(const bool state)
{
//--- K9B8, 5A;8 (1) =5 2 @568<5 "20 A>AB>O=8O" 8;8 (2) M;5<5=B 701;>:8@>20= 8;8 (3) :=>?:0 C65 2 B0:>< A>AB>O=88
if(!m_two_state || CElementBase::IsLocked() || m_is_pressed==state)
return;
//--- #AB0=>2:0 A>AB>O=8O
m_is_pressed=state;
//--- #AB0=>28BL A>>B25BAB2CNICN :0@B8=:C
CElement::ChangeImage(0,!m_is_pressed? 0 : 2);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 :0@B8=:8 4;O =060B>3> A>AB>O=8O (4>ABC?5=) |
//+------------------------------------------------------------------+
void CButton::IconFilePressed(const string file_path)
{
//--- K9B8, 5A;8 C :=>?:8 >B:;NG5= @568< "20 A>AB>O=8O"
if(!m_two_state)
return;
//--- >1028BL 87>1@065=85
CElement::IconFilePressed(file_path);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 :0@B8=:8 4;O =060B>3> A>AB>O=8O (701;>:8@>20=) |
//+------------------------------------------------------------------+
void CButton::IconFilePressedLocked(const string file_path)
{
//--- K9B8, 5A;8 C :=>?:8 >B:;NG5= @568< "20 A>AB>O=8O"
if(!m_two_state)
return;
//--- >1028BL 87>1@065=85
CElement::IconFilePressedLocked(file_path);
}
//+------------------------------------------------------------------+
//| 7<5=5=85 @07<5@>2 |
//+------------------------------------------------------------------+
void CButton::ChangeSize(const uint x_size,const uint y_size)
{
int images_group=(int)ImagesGroupTotal();
for(int i=0; i<images_group; i++)
{
int right_gap =m_x_size-ImageGroupXGap(i);
ImageGroupXGap(i,(int)x_size-right_gap);
}
//--- #AB0=>28BL =>2K9 @07<5@
CElementBase::XSize(x_size);
CElementBase::YSize(y_size);
m_canvas.XSize(m_x_size);
m_canvas.YSize(m_y_size);
m_canvas.Resize(m_x_size,m_y_size);
}
//+------------------------------------------------------------------+
//| 060B85 =0 :=>?:C |
//+------------------------------------------------------------------+
bool CButton::OnClickButton(const string pressed_object)
{
//--- K945<, 5A;8 (1) GC6>5 8<O >1J5:B0 8;8 (2) M;5<5=B 701;>:8@>20=
if(m_canvas.ChartObjectName()!=pressed_object || CElementBase::IsLocked())
return(false);
//--- A;8 MB> :=>?:0 A 42C<O A>AB>O=8O<8
if(m_two_state)
IsPressed(!IsPressed());
//--- 5@5@8A>20BL M;5<5=B
Update(true);
//--- B?@028< A>>1I5=85 >1 MB><
::EventChartCustom(m_chart_id,ON_CLICK_BUTTON,CElementBase::Id(),CElementBase::Index(),m_canvas.ChartObjectName());
return(true);
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CButton::Draw(void)
{
//--- 0@8A>20BL D>=
DrawBackground();
//--- 0@8A>20BL @0<:C
DrawBorder();
//--- 0@8A>20BL :0@B8=:C
DrawImage();
//--- 0@8A>20BL B5:AB
CElement::DrawText();
}
//+------------------------------------------------------------------+
//| 8AC5B D>= |
//+------------------------------------------------------------------+
void CButton::DrawBackground(void)
{
//--- ?@545;8< F25B
uint clr=(m_is_pressed)? m_back_color_pressed : m_back_color;
//--- A;8 M;5<5=B =5 701;>:8@>20=
if(!CElementBase::IsLocked())
{
if(CElementBase::MouseFocus())
clr=(m_mouse.LeftButtonState() || m_is_pressed)? m_back_color_pressed : m_back_color_hover;
}
else
clr=m_back_color_locked;
//--- 8AC5< D>=
CElement::m_canvas.Erase(::ColorToARGB(clr,m_alpha));
}
//+------------------------------------------------------------------+
//| 8AC5B @0<:C ?>;O 22>40 |
//+------------------------------------------------------------------+
void CButton::DrawBorder(void)
{
//--- ?@545;8< F25B
uint clr=(m_is_pressed)? m_border_color_pressed : m_border_color;
//--- A;8 M;5<5=B =5 701;>:8@>20=
if(!CElementBase::IsLocked())
{
if(CElementBase::MouseFocus())
clr=(m_mouse.LeftButtonState() || m_is_pressed)? m_border_color_pressed : m_border_color_hover;
}
else
clr=m_border_color_locked;
//--- >>@48=0BK
int x1=0,y1=0;
int x2=(int)::ObjectGetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_XSIZE)-1;
int y2=(int)::ObjectGetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_YSIZE)-1;
//--- 8AC5< ?@O<>C3>;L=8: 157 70;82:8
m_canvas.Rectangle(x1,y1,x2,y2,::ColorToARGB(clr));
}
//+------------------------------------------------------------------+
//| 8AC5B :0@B8=:C |
//+------------------------------------------------------------------+
void CButton::DrawImage(void)
{
//--- ?@545;8< 8=45:A
uint image_index=(!m_two_state)? 0 :(m_is_pressed)? 2 : 0;
//--- A;8 M;5<5=B =5 701;>:8@>20=
if(!CElementBase::IsLocked())
{
if(!m_two_state)
image_index=0;
else
{
if(CElementBase::MouseFocus())
image_index=(m_mouse.LeftButtonState() || m_is_pressed)? 2 : 0;
}
}
else
image_index=(!m_two_state)? 1 :(m_is_pressed)? 3 : 1;
//--- !>E@0=8BL 8=45:A 2K1@0==>3> 87>1@065=8O
CElement::ChangeImage(0,image_index);
//--- 8AC5< :0@B8=:C
CElement::DrawImage();
}
//+------------------------------------------------------------------+
//| 7<5=8BL H8@8=C ?> ?@02><C :@0N D>@<K |
//+------------------------------------------------------------------+
void CButton::ChangeWidthByRightWindowSide(void)
{
//--- K9B8, 5A;8 2:;NG5= @568< D8:A0F88 : ?@02><C :@0N D>@<K
if(m_anchor_right_window_side)
return;
//--- >>@48=0BK
int x=0;
//--- 07<5@K
int x_size =m_main.X2()-CElementBase::X()-m_auto_xresize_right_offset;
int y_size =(m_auto_yresize_mode)? m_main.Y2()-CElementBase::Y()-m_auto_yresize_bottom_offset : m_y_size;
//--- #AB0=>28BL =>2K9 @07<5@
m_canvas.Resize(x_size,y_size);
//--- 5@5@8A>20BL M;5<5=B
Draw();
}
//+------------------------------------------------------------------+