| //+------------------------------------------------------------------+
|
| //| 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());
|
| }
|
| //+------------------------------------------------------------------+
|