308 lines
12 KiB
MQL5
308 lines
12 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| WndClient.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "WndContainer.mqh"
| |||
#include "Panel.mqh"
| |||
#include "Scrolls.mqh"
| |||
//+------------------------------------------------------------------+
| |||
//| Class CWndClient |
| |||
//| Usage: base class to create areas with |
| |||
//| the scrollbars |
| |||
//+------------------------------------------------------------------+
| |||
class CWndClient : public CWndContainer
| |||
{
| |||
protected:
| |||
//--- flags
| |||
bool m_v_scrolled; // "vertical scrolling is possible" flag
| |||
bool m_h_scrolled; // "horizontal scrolling is possible" flag
| |||
//--- dependent controls
| |||
CPanel m_background; // the "scrollbar background" object
| |||
CScrollV m_scroll_v; // the vertical scrollbar object
| |||
CScrollH m_scroll_h; // the horizontal scrollbar object
| |||
| |||
public:
| |||
CWndClient(void);
| |||
~CWndClient(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);
| |||
//--- parameters
| |||
virtual bool ColorBackground(const color value) { return(m_background.ColorBackground(value)); }
| |||
virtual bool ColorBorder(const color value) { return(m_background.ColorBorder(value)); }
| |||
virtual bool BorderType(const ENUM_BORDER_TYPE flag) { return(m_background.BorderType(flag)); }
| |||
//--- settings
| |||
virtual bool VScrolled(void) { return(m_v_scrolled); }
| |||
virtual bool VScrolled(const bool flag);
| |||
virtual bool HScrolled(void) { return(m_h_scrolled); }
| |||
virtual bool HScrolled(const bool flag);
| |||
//--- ID
| |||
virtual long Id(const long id);
| |||
virtual long Id(void) const { return(CWnd::Id()); }
| |||
//--- state
| |||
virtual bool Show(void);
| |||
| |||
protected:
| |||
//--- create dependent controls
| |||
virtual bool CreateBack(void);
| |||
virtual bool CreateScrollV(void);
| |||
virtual bool CreateScrollH(void);
| |||
//--- internal event handlers
| |||
virtual bool OnResize(void);
| |||
//--- handlers of the dependent controls events
| |||
virtual bool OnVScrollShow(void) { return(true); }
| |||
virtual bool OnVScrollHide(void) { return(true); }
| |||
virtual bool OnHScrollShow(void) { return(true); }
| |||
virtual bool OnHScrollHide(void) { return(true); }
| |||
virtual bool OnScrollLineDown(void) { return(true); }
| |||
virtual bool OnScrollLineUp(void) { return(true); }
| |||
virtual bool OnScrollLineLeft(void) { return(true); }
| |||
virtual bool OnScrollLineRight(void) { return(true); }
| |||
//--- resize
| |||
virtual bool Rebound(const CRect &rect);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Common handler of chart events |
| |||
//+------------------------------------------------------------------+
| |||
EVENT_MAP_BEGIN(CWndClient)
| |||
ON_NAMED_EVENT(ON_SHOW,m_scroll_v,OnVScrollShow)
| |||
ON_NAMED_EVENT(ON_HIDE,m_scroll_v,OnVScrollHide)
| |||
ON_EVENT(ON_SCROLL_DEC,m_scroll_v,OnScrollLineUp)
| |||
ON_EVENT(ON_SCROLL_INC,m_scroll_v,OnScrollLineDown)
| |||
ON_NAMED_EVENT(ON_SHOW,m_scroll_h,OnHScrollShow)
| |||
ON_NAMED_EVENT(ON_HIDE,m_scroll_h,OnHScrollHide)
| |||
ON_EVENT(ON_SCROLL_DEC,m_scroll_h,OnScrollLineLeft)
| |||
ON_EVENT(ON_SCROLL_INC,m_scroll_h,OnScrollLineRight)
| |||
EVENT_MAP_END(CWndContainer)
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CWndClient::CWndClient(void) : m_v_scrolled(false),
| |||
m_h_scrolled(false)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CWndClient::~CWndClient(void)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create a control |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
| |||
{
| |||
//--- call of the method of the parent class
| |||
if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2))
| |||
return(false);
| |||
//--- create dependent controls
| |||
if(!CreateBack())
| |||
return(false);
| |||
if(m_v_scrolled && !CreateScrollV())
| |||
return(false);
| |||
if(m_h_scrolled && !CreateScrollH())
| |||
return(false);
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create scrollbar background |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::CreateBack(void)
| |||
{
| |||
//--- create
| |||
if(!m_background.Create(m_chart_id,m_name+"Back",m_subwin,0,0,Width(),Height()))
| |||
return(false);
| |||
if(!m_background.ColorBorder(CONTROLS_CLIENT_COLOR_BORDER))
| |||
return(false);
| |||
if(!m_background.ColorBackground(CONTROLS_CLIENT_COLOR_BG))
| |||
return(false);
| |||
if(!Add(m_background))
| |||
return(false);
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create vertical scrollbar |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::CreateScrollV(void)
| |||
{
| |||
//--- calculate coordinates
| |||
int x1=Width()-CONTROLS_SCROLL_SIZE-CONTROLS_BORDER_WIDTH;
| |||
int y1=CONTROLS_BORDER_WIDTH;
| |||
int x2=Width()-CONTROLS_BORDER_WIDTH;
| |||
int y2=Height()-CONTROLS_BORDER_WIDTH;
| |||
if(m_h_scrolled) y2-=CONTROLS_SCROLL_SIZE;
| |||
//--- create
| |||
if(!m_scroll_v.Create(m_chart_id,m_name+"VScroll",m_subwin,x1,y1,x2,y2))
| |||
return(false);
| |||
if(!Add(m_scroll_v))
| |||
return(false);
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create horizontal scrollbar |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::CreateScrollH(void)
| |||
{
| |||
//--- calculate coordinates
| |||
int x1=CONTROLS_BORDER_WIDTH;
| |||
int y1=Height()-CONTROLS_SCROLL_SIZE-CONTROLS_BORDER_WIDTH;
| |||
int x2=Width()-CONTROLS_BORDER_WIDTH;
| |||
int y2=Height()-CONTROLS_BORDER_WIDTH;
| |||
if(m_v_scrolled) x2-=CONTROLS_SCROLL_SIZE;
| |||
//--- create
| |||
if(!m_scroll_h.Create(m_chart_id,m_name+"HScroll",m_subwin,x1,y1,x2,y2))
| |||
return(false);
| |||
if(!Add(m_scroll_h))
| |||
return(false);
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set up vertical scrollbar |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::VScrolled(const bool flag)
| |||
{
| |||
if(m_v_scrolled==flag)
| |||
return(true);
| |||
//--- there are changes
| |||
int d_size=0;
| |||
if(flag)
| |||
{
| |||
//--- create vertical scrollbar
| |||
if(!CreateScrollV())
| |||
return(false);
| |||
//--- need to shorten horizontal scrollbar (if there is one)
| |||
d_size=-CONTROLS_SCROLL_SIZE;
| |||
}
| |||
else
| |||
{
| |||
//--- delete vertical scrollbar
| |||
m_scroll_v.Destroy();
| |||
if(!Delete(m_scroll_v))
| |||
return(false);
| |||
//--- need to lengthen horizontal scrollbar (if there is one)
| |||
d_size=CONTROLS_SCROLL_SIZE;
| |||
}
| |||
m_v_scrolled=flag;
| |||
//--- change width of horizontal scrollbar (if there is one)
| |||
if(m_h_scrolled)
| |||
{
| |||
if(!m_scroll_h.Width(m_scroll_h.Width()+d_size))
| |||
return(false);
| |||
}
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set up horizontal scrollbar |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::HScrolled(const bool flag)
| |||
{
| |||
if(m_h_scrolled==flag)
| |||
return(true);
| |||
//--- there are changes
| |||
int d_size=0;
| |||
if(flag)
| |||
{
| |||
//--- create horizontal scrollbar
| |||
if(!CreateScrollH())
| |||
return(false);
| |||
//--- need to shorten vertical scrollbar (if there is one)
| |||
d_size=-CONTROLS_SCROLL_SIZE;
| |||
}
| |||
else
| |||
{
| |||
//--- delete horizontal scrollbar
| |||
m_scroll_h.Destroy();
| |||
if(!Delete(m_scroll_h))
| |||
return(false);
| |||
//--- need to lengthen vertical scrollbar (if there is one)
| |||
d_size=CONTROLS_SCROLL_SIZE;
| |||
}
| |||
m_h_scrolled=flag;
| |||
//--- change width of vertical scrollbar (if there is one)
| |||
if(m_v_scrolled)
| |||
{
| |||
if(!m_scroll_v.Height(m_scroll_v.Height()+d_size))
| |||
return(false);
| |||
}
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set ID of control |
| |||
//+------------------------------------------------------------------+
| |||
long CWndClient::Id(const long id)
| |||
{
| |||
//--- reserve ID for container
| |||
long id_used=CWndContainer::Id(id);
| |||
//---
| |||
if(!m_v_scrolled)
| |||
id_used+=m_scroll_v.Id(id+id_used);
| |||
if(!m_h_scrolled)
| |||
id_used+=m_scroll_h.Id(id+id_used);
| |||
//--- return number of used IDs
| |||
return(id_used);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Makes the control visible |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::Show(void)
| |||
{
| |||
//--- call of the method of the parent class
| |||
CWndContainer::Show();
| |||
//---
| |||
if(!m_v_scrolled)
| |||
m_scroll_v.Hide();
| |||
if(!m_h_scrolled)
| |||
m_scroll_h.Hide();
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Handler of resizing |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::OnResize(void)
| |||
{
| |||
//--- call of the method of the parent class
| |||
if(!CWndContainer::OnResize())
| |||
return(false);
| |||
//--- resize background
| |||
int d_size=0;
| |||
m_background.Width(Width());
| |||
m_background.Height(Height());
| |||
//---
| |||
if(m_v_scrolled)
| |||
{
| |||
//--- move vertical scrollbar
| |||
m_scroll_v.Move(Right()-CONTROLS_SCROLL_SIZE,Top());
| |||
//--- modify vertical scrollbar
| |||
d_size=(m_h_scrolled) ? CONTROLS_SCROLL_SIZE : 0;
| |||
m_scroll_v.Height(Height()-d_size);
| |||
}
| |||
if(m_h_scrolled)
| |||
{
| |||
//--- move horizontal scrollbar
| |||
m_scroll_h.Move(Left(),Bottom()-CONTROLS_SCROLL_SIZE);
| |||
//--- modify horizontal scrollbar
| |||
d_size=(m_v_scrolled) ? CONTROLS_SCROLL_SIZE : 0;
| |||
m_scroll_h.Width(Width()-d_size);
| |||
}
| |||
//--- succeed
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Resize |
| |||
//+------------------------------------------------------------------+
| |||
bool CWndClient::Rebound(const CRect &rect)
| |||
{
| |||
m_rect.SetBound(rect);
| |||
//--- call virtual event handler
| |||
return(OnResize());
| |||
}
| |||
//+------------------------------------------------------------------+
|