269 lines
11 KiB
MQL5
269 lines
11 KiB
MQL5
|
//+------------------------------------------------------------------+
|
|||
|
//| BmpButton.mqh |
|
|||
|
//| Copyright 2000-2025, MetaQuotes Ltd. |
|
|||
|
//| https://www.mql5.com |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
#include "WndObj.mqh"
|
|||
|
#include <ChartObjects\ChartObjectsBmpControls.mqh>
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Class CBmpButton |
|
|||
|
//| Usage: control that is displayed by |
|
|||
|
//| the CChartObjectBmpLabel object |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
class CBmpButton : public CWndObj
|
|||
|
{
|
|||
|
private:
|
|||
|
CChartObjectBmpLabel m_button; // chart object
|
|||
|
//--- parameters of the chart object
|
|||
|
int m_border; // border width
|
|||
|
string m_bmp_off_name; // name of BMP file for the "OFF" state (default state)
|
|||
|
string m_bmp_on_name; // name of BMP file for the "ON" state
|
|||
|
string m_bmp_passive_name;
|
|||
|
string m_bmp_active_name;
|
|||
|
|
|||
|
public:
|
|||
|
CBmpButton(void);
|
|||
|
~CBmpButton(void);
|
|||
|
//--- create
|
|||
|
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
|
|||
|
//--- parameters of the chart object
|
|||
|
int Border(void) const { return(m_border); }
|
|||
|
bool Border(const int value);
|
|||
|
bool BmpNames(const string off="",const string on="");
|
|||
|
string BmpOffName(void) const { return(m_bmp_off_name); }
|
|||
|
bool BmpOffName(const string name);
|
|||
|
string BmpOnName(void) const { return(m_bmp_on_name); }
|
|||
|
bool BmpOnName(const string name);
|
|||
|
string BmpPassiveName(void) const { return(m_bmp_passive_name); }
|
|||
|
bool BmpPassiveName(const string name);
|
|||
|
string BmpActiveName(void) const { return(m_bmp_active_name); }
|
|||
|
bool BmpActiveName(const string name);
|
|||
|
//--- state
|
|||
|
bool Pressed(void) const { return(m_button.State()); }
|
|||
|
bool Pressed(const bool pressed) { return(m_button.State(pressed)); }
|
|||
|
//--- properties
|
|||
|
bool Locking(void) const { return(IS_CAN_LOCK); }
|
|||
|
void Locking(const bool locking);
|
|||
|
|
|||
|
protected:
|
|||
|
//--- handlers of object settings
|
|||
|
virtual bool OnSetZOrder(void) { return(m_button.Z_Order(m_zorder)); }
|
|||
|
//--- internal event handlers
|
|||
|
virtual bool OnCreate(void);
|
|||
|
virtual bool OnShow(void);
|
|||
|
virtual bool OnHide(void);
|
|||
|
virtual bool OnMove(void);
|
|||
|
virtual bool OnChange(void);
|
|||
|
//--- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
virtual bool OnActivate(void);
|
|||
|
virtual bool OnDeactivate(void);
|
|||
|
virtual bool OnMouseDown(void);
|
|||
|
virtual bool OnMouseUp(void);
|
|||
|
};
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Constructor |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
CBmpButton::CBmpButton(void) : m_border(0),
|
|||
|
m_bmp_off_name(NULL),
|
|||
|
m_bmp_on_name(NULL),
|
|||
|
m_bmp_passive_name(NULL),
|
|||
|
m_bmp_active_name(NULL)
|
|||
|
{
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Destructor |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
CBmpButton::~CBmpButton(void)
|
|||
|
{
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Create a control |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
|
|||
|
{
|
|||
|
//--- call method of the parent class
|
|||
|
if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2))
|
|||
|
return(false);
|
|||
|
//--- create the chart object
|
|||
|
if(!m_button.Create(chart,name,subwin,x1,y1))
|
|||
|
return(false);
|
|||
|
//--- call the settings handler
|
|||
|
return(OnChange());
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set border width |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::Border(const int value)
|
|||
|
{
|
|||
|
//--- save new value of parameter
|
|||
|
m_border=value;
|
|||
|
//--- set up the chart object
|
|||
|
return(m_button.Width(value));
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set two images at once |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::BmpNames(const string off,const string on)
|
|||
|
{
|
|||
|
//--- save new values of parameters
|
|||
|
m_bmp_off_name=off;
|
|||
|
m_bmp_on_name =on;
|
|||
|
//--- set up the chart object
|
|||
|
if(!m_button.BmpFileOff(off))
|
|||
|
return(false);
|
|||
|
if(!m_button.BmpFileOn(on))
|
|||
|
return(false);
|
|||
|
//--- succeed
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set image for the "OFF" state |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::BmpOffName(const string name)
|
|||
|
{
|
|||
|
//--- save new value of parameter
|
|||
|
m_bmp_off_name=name;
|
|||
|
//--- set up the chart object
|
|||
|
if(!m_button.BmpFileOff(name))
|
|||
|
return(false);
|
|||
|
//--- set size by image dimensions
|
|||
|
Width(m_button.X_Size());
|
|||
|
Height(m_button.Y_Size());
|
|||
|
//--- succeed
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set image for the "ON" state |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::BmpOnName(const string name)
|
|||
|
{
|
|||
|
//--- save new value of parameter
|
|||
|
m_bmp_on_name=name;
|
|||
|
//--- set up the chart object
|
|||
|
if(!m_button.BmpFileOn(name))
|
|||
|
return(false);
|
|||
|
//--- set size by image dimensions
|
|||
|
Width(m_button.X_Size());
|
|||
|
Height(m_button.Y_Size());
|
|||
|
//--- succeed
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set image for the "OFF" state (passive) |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::BmpPassiveName(const string name)
|
|||
|
{
|
|||
|
//--- save new value of parameter
|
|||
|
m_bmp_passive_name=name;
|
|||
|
//--- set up the chart object
|
|||
|
if(!IS_ACTIVE)
|
|||
|
return(BmpOffName(name));
|
|||
|
//--- succeed
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set image for the "OFF" state (active) |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::BmpActiveName(const string name)
|
|||
|
{
|
|||
|
//--- save new value of parameter
|
|||
|
m_bmp_active_name=name;
|
|||
|
//--- set up the chart object
|
|||
|
if(IS_ACTIVE)
|
|||
|
return(BmpOffName(name));
|
|||
|
//--- succeed
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Locking flag |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
void CBmpButton::Locking(const bool flag)
|
|||
|
{
|
|||
|
if(flag)
|
|||
|
PropFlagsSet(WND_PROP_FLAG_CAN_LOCK);
|
|||
|
else
|
|||
|
PropFlagsReset(WND_PROP_FLAG_CAN_LOCK);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Create object on chart |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnCreate(void)
|
|||
|
{
|
|||
|
//--- create the chart object by previously set parameters
|
|||
|
return(m_button.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top));
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Display object on chart |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnShow(void)
|
|||
|
{
|
|||
|
return(m_button.Timeframes(OBJ_ALL_PERIODS));
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Hide object from chart |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnHide(void)
|
|||
|
{
|
|||
|
return(m_button.Timeframes(OBJ_NO_PERIODS));
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Absolute movement of the chart object |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnMove(void)
|
|||
|
{
|
|||
|
//--- position the chart object
|
|||
|
return(m_button.X_Distance(m_rect.left) && m_button.Y_Distance(m_rect.top));
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Set up the chart object |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnChange(void)
|
|||
|
{
|
|||
|
//--- set up the chart object
|
|||
|
return(m_button.Width(m_border) && m_button.BmpFileOff(m_bmp_off_name) && m_button.BmpFileOn(m_bmp_on_name));
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Handler of activating the group of controls |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnActivate(void)
|
|||
|
{
|
|||
|
if(m_bmp_active_name!=NULL)
|
|||
|
BmpOffName(m_bmp_active_name);
|
|||
|
//--- handled
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Handler of deactivating the group of controls |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnDeactivate(void)
|
|||
|
{
|
|||
|
if(m_bmp_passive_name!=NULL)
|
|||
|
BmpOffName(m_bmp_passive_name);
|
|||
|
if(!IS_CAN_LOCK)
|
|||
|
Pressed(false);
|
|||
|
//--- handled
|
|||
|
return(true);
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Handler of click on the left mouse button |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnMouseDown(void)
|
|||
|
{
|
|||
|
if(!IS_CAN_LOCK)
|
|||
|
Pressed(!Pressed());
|
|||
|
//--- call of the method of the parent class
|
|||
|
return(CWnd::OnMouseDown());
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
//| Handler of click on the left mouse button |
|
|||
|
//+------------------------------------------------------------------+
|
|||
|
bool CBmpButton::OnMouseUp(void)
|
|||
|
{
|
|||
|
//--- depress the button if it is not fixed
|
|||
|
if(m_button.State() && !IS_CAN_LOCK)
|
|||
|
m_button.State(false);
|
|||
|
//--- call of the method of the parent class
|
|||
|
return(CWnd::OnMouseUp());
|
|||
|
}
|
|||
|
//+------------------------------------------------------------------+
|