//+------------------------------------------------------------------+ //| Box.mqh | //| Enrico Lambino | //| www.mql5.com/en/users/iceron| //+------------------------------------------------------------------+ #property copyright "Enrico Lambino" #property link "https://www.mql5.com/en/articles/1867" #include #define CLASS_LAYOUT 999 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum LAYOUT_STYLE { LAYOUT_STYLE_VERTICAL, LAYOUT_STYLE_HORIZONTAL }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum VERTICAL_ALIGN { VERTICAL_ALIGN_CENTER, VERTICAL_ALIGN_CENTER_NOSIDES, VERTICAL_ALIGN_TOP, VERTICAL_ALIGN_BOTTOM }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum HORIZONTAL_ALIGN { HORIZONTAL_ALIGN_CENTER, HORIZONTAL_ALIGN_CENTER_NOSIDES, HORIZONTAL_ALIGN_LEFT, HORIZONTAL_ALIGN_RIGHT }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CBox : public CWndClient { protected: LAYOUT_STYLE m_layout_style; VERTICAL_ALIGN m_vertical_align; HORIZONTAL_ALIGN m_horizontal_align; CSize m_min_size; int m_controls_total; int m_padding_top; int m_padding_bottom; int m_padding_left; int m_padding_right; int m_total_x; int m_total_y; public: CBox(); ~CBox(); virtual int Type() const {return CLASS_LAYOUT;} virtual bool Create(const long chart,const string name,const int subwin, const int x1,const int y1,const int x2,const int y2); virtual bool Pack(); void LayoutStyle(LAYOUT_STYLE style){m_layout_style=style;} LAYOUT_STYLE LayoutStyle() const {return(m_layout_style);} void HorizontalAlign(const HORIZONTAL_ALIGN align){m_horizontal_align=align;} HORIZONTAL_ALIGN HorizontalAlign() const {return(m_horizontal_align);} void VerticalAlign(const VERTICAL_ALIGN align){m_vertical_align=align;} VERTICAL_ALIGN VerticalAlign() const {return(m_vertical_align);} void Padding(const int top,const int bottom,const int left,const int right); void Padding(const int padding); void PaddingTop(const int padding) {m_padding_top=padding;} int PaddingTop() const {return(m_padding_top);} void PaddingRight(const int padding) {m_padding_right=padding;} int PaddingRight() const {return(m_padding_right);} void PaddingBottom(const int padding) {m_padding_bottom=padding;} int PaddingBottom() const {return(m_padding_bottom);} void PaddingLeft(const int padding) {m_padding_left=padding;} int PaddingLeft() const {return(m_padding_left);} protected: virtual void CheckControlSize(CWnd *control); virtual void GetTotalControlsSize(void); virtual bool GetSpace(int &x_space,int &y_space); virtual bool Render(void); virtual void Shift(CWnd *control,int &x,int &y,const int x_space,const int y_space); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CBox::CBox() : m_layout_style(LAYOUT_STYLE_HORIZONTAL), m_vertical_align(VERTICAL_ALIGN_CENTER), m_horizontal_align(HORIZONTAL_ALIGN_CENTER), m_controls_total(0), m_padding_top(2), m_padding_bottom(2), m_padding_left(2), m_padding_right(2), m_total_x(0), m_total_y(0) { m_min_size.cx = 0; m_min_size.cy = 0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CBox::~CBox() { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CBox::Create(const long chart,const string name,const int subwin, const int x1,const int y1,const int x2,const int y2) { if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2)) return(false); if(!CreateBack()) return(false); if(!ColorBackground(CONTROLS_DIALOG_COLOR_CLIENT_BG)) return(false); if(!ColorBorder(clrNONE)) return(false); return(true); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CBox::Pack(void) { GetTotalControlsSize(); return(Render()); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CBox::CheckControlSize(CWnd *control) { bool adjust=false; CSize size=Size(); CSize control_size=control.Size(); if(control_size.cx>size.cx-(m_padding_left+m_padding_right)) { control_size.cx=size.cx-(m_padding_left+m_padding_right); adjust=true; } if(control_size.cy>size.cy-(m_padding_top+m_padding_bottom)) { control_size.cy=size.cy-(m_padding_top+m_padding_bottom); adjust=true; } if(adjust) control.Size(control_size.cx,control_size.cy); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CBox::GetTotalControlsSize(void) { m_total_x = 0; m_total_y = 0; m_controls_total = 0; m_min_size.cx = 0; m_min_size.cy = 0; int total=ControlsTotal(); for(int i=0;i