ProfitLossCalculator/Grid.mqh

123 lines
4.8 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:17:29 +02:00
//+------------------------------------------------------------------+
//| Grid.mqh |
//| Enrico Lambino |
//| www.mql5.com/en/users/iceron|
//+------------------------------------------------------------------+
#property copyright "Enrico Lambino"
#property link "https://www.mql5.com/en/articles/1998"
#property strict
#include "Box.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CGrid : public CBox
{
protected:
int m_cols;
int m_rows;
int m_hgap;
int m_vgap;
CSize m_cell_size;
public:
CGrid();
CGrid(int rows,int cols,int hgap=0,int vgap=0);
~CGrid();
virtual int Type() const {return CLASS_LAYOUT;}
virtual bool Init(int rows,int cols,int hgap=0,int vgap=0);
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 int Columns(){return(m_cols);}
virtual void Columns(int cols){m_cols=cols;}
virtual int Rows(){return(m_rows);}
virtual void Rows(int rows){m_rows=rows;}
virtual int HGap(){return(m_hgap);}
virtual void HGap(int gap){m_hgap=gap;}
virtual int VGap(){return(m_vgap);}
virtual void VGap(int gap){m_vgap=gap;}
virtual bool Pack();
protected:
virtual void CheckControlSize(CWnd *control);
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CGrid::CGrid()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CGrid::CGrid(int rows,int cols,int hgap=0,int vgap=0)
{
Init(rows,cols,hgap,vgap);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CGrid::~CGrid()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CGrid::Init(int rows,int cols,int hgap=0,int vgap=0)
{
Columns(cols);
Rows(rows);
HGap(hgap);
VGap(vgap);
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CGrid::Create(const long chart,const string name,const int subwin,
const int x1,const int y1,const int x2,const int y2)
{
return(CBox::Create(chart,name,subwin,x1,y1,x2,y2));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CGrid::Pack()
{
CSize size=Size();
m_cell_size.cx = (size.cx-((m_cols+1)*m_hgap))/m_cols;
m_cell_size.cy = (size.cy-((m_rows+1)*m_vgap))/m_rows;
int x=Left(),y=Top();
int cnt=0;
for(int i=0;i<ControlsTotal();i++)
{
CWnd *control=Control(i);
if(control==NULL)
continue;
if(control==GetPointer(m_background))
continue;
if(cnt==0 || Right()-(x+m_cell_size.cx)<m_cell_size.cx+m_hgap)
{
if(cnt==0)
y+=m_vgap;
else y+=m_vgap+m_cell_size.cy;
x=Left()+m_hgap;
}
else x+=m_cell_size.cx+m_hgap;
CheckControlSize(control);
control.Move(x,y);
if(control.Type()==CLASS_LAYOUT)
{
CBox *container=control;
container.Pack();
}
cnt++;
}
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CGrid::CheckControlSize(CWnd *control)
{
control.Size(m_cell_size.cx,m_cell_size.cy);
}
//+------------------------------------------------------------------+