183 lines
7.3 KiB
MQL5
183 lines
7.3 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| CheckBox.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "WndContainer.mqh"
| |||
#include "BmpButton.mqh"
| |||
#include "Edit.mqh"
| |||
//+------------------------------------------------------------------+
| |||
//| Resources |
| |||
//+------------------------------------------------------------------+
| |||
#resource "res\\CheckBoxOn.bmp"
| |||
#resource "res\\CheckBoxOff.bmp"
| |||
//+------------------------------------------------------------------+
| |||
//| Class CCheckBox |
| |||
//| Usage: class that implements the "CheckBox" control |
| |||
//+------------------------------------------------------------------+
| |||
class CCheckBox : public CWndContainer
| |||
{
| |||
private:
| |||
//--- dependent controls
| |||
CBmpButton m_button; // button object
| |||
CEdit m_label; // label object
| |||
//--- data
| |||
int m_value; // value
| |||
| |||
public:
| |||
CCheckBox(void);
| |||
~CCheckBox(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);
| |||
//--- chart event handler
| |||
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
| |||
//--- settings
| |||
string Text(void) const { return(m_label.Text()); }
| |||
bool Text(const string value) { return(m_label.Text(value)); }
| |||
color Color(void) const { return(m_label.Color()); }
| |||
bool Color(const color value) { return(m_label.Color(value)); }
| |||
//--- state
| |||
bool Checked(void) const { return(m_button.Pressed()); }
| |||
bool Checked(const bool flag) { return(m_button.Pressed(flag)); }
| |||
//--- data
| |||
int Value(void) const { return(m_value); }
| |||
void Value(const int value) { m_value=value; }
| |||
//--- methods for working with files
| |||
virtual bool Save(const int file_handle);
| |||
virtual bool Load(const int file_handle);
| |||
| |||
protected:
| |||
//--- create dependent controls
| |||
virtual bool CreateButton(void);
| |||
virtual bool CreateLabel(void);
| |||
//--- handlers of the dependent controls events
| |||
virtual bool OnClickButton(void);
| |||
virtual bool OnClickLabel(void);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Common handler of chart events |
| |||
//+------------------------------------------------------------------+
| |||
EVENT_MAP_BEGIN(CCheckBox)
| |||
ON_EVENT(ON_CLICK,m_button,OnClickButton)
| |||
ON_EVENT(ON_CLICK,m_label,OnClickLabel)
| |||
EVENT_MAP_END(CWndContainer)
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CCheckBox::CCheckBox(void) : m_value(0)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CCheckBox::~CCheckBox(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create a control |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::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(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2))
| |||
return(false);
| |||
//--- create dependent controls
| |||
if(!CreateButton())
| |||
return(false);
| |||
if(!CreateLabel())
| |||
return(false);
| |||
//--- succeeded
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create button |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::CreateButton(void)
| |||
{
| |||
//--- calculate coordinates
| |||
int x1=CONTROLS_CHECK_BUTTON_X_OFF;
| |||
int y1=CONTROLS_CHECK_BUTTON_Y_OFF;
| |||
int x2=x1+CONTROLS_BUTTON_SIZE;
| |||
int y2=y1+CONTROLS_BUTTON_SIZE-CONTROLS_BORDER_WIDTH;
| |||
//--- create
| |||
if(!m_button.Create(m_chart_id,m_name+"Button",m_subwin,x1,y1,x2,y2))
| |||
return(false);
| |||
if(!m_button.BmpNames("::res\\CheckBoxOff.bmp","::res\\CheckBoxOn.bmp"))
| |||
return(false);
| |||
if(!Add(m_button))
| |||
return(false);
| |||
m_button.Locking(true);
| |||
//--- succeeded
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create label |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::CreateLabel(void)
| |||
{
| |||
//--- calculate coordinates
| |||
int x1=CONTROLS_CHECK_LABEL_X_OFF;
| |||
int y1=CONTROLS_CHECK_LABEL_Y_OFF;
| |||
int x2=Width();
| |||
int y2=Height();
| |||
//--- create
| |||
if(!m_label.Create(m_chart_id,m_name+"Label",m_subwin,x1,y1,x2,y2))
| |||
return(false);
| |||
if(!m_label.Text(m_name))
| |||
return(false);
| |||
if(!Add(m_label))
| |||
return(false);
| |||
m_label.ReadOnly(true);
| |||
m_label.ColorBackground(CONTROLS_CHECKGROUP_COLOR_BG);
| |||
m_label.ColorBorder(CONTROLS_CHECKGROUP_COLOR_BG);
| |||
//--- succeeded
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::Save(const int file_handle)
| |||
{
| |||
//--- check
| |||
if(file_handle==INVALID_HANDLE)
| |||
return(false);
| |||
//---
| |||
FileWriteInteger(file_handle,Checked());
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::Load(const int file_handle)
| |||
{
| |||
//--- check
| |||
if(file_handle==INVALID_HANDLE)
| |||
return(false);
| |||
//---
| |||
if(!FileIsEnding(file_handle))
| |||
Checked(FileReadInteger(file_handle));
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Handler of click on button |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::OnClickButton(void)
| |||
{
| |||
//--- send the "changed state" event
| |||
EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name);
| |||
//--- handled
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Handler of click on label |
| |||
//+------------------------------------------------------------------+
| |||
bool CCheckBox::OnClickLabel(void)
| |||
{
| |||
//--- change button state
| |||
m_button.Pressed(!m_button.Pressed());
| |||
//--- return the result of the button click handler
| |||
return(OnClickButton());
| |||
}
| |||
//+------------------------------------------------------------------+
|