EasyAndFastMod/Controls/ProgressBar.mqh

265 lines
22 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| ProgressBar.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O 8=48:0B>@0 2K?>;=5=8O |
//+------------------------------------------------------------------+
class CProgressBar : public CElement
{
private:
//--- &25B0 D>=0 ?@>3@5AA-10@0 8 @0<:8 D>=0
color m_bar_back_color;
//--- 07<5@K ?@>3@5AA-10@0
int m_bar_x_size;
int m_bar_y_size;
//--- !<5I5=85 ?@>3@5AA-10@0 ?> 42C< >AO<
int m_bar_x_gap;
int m_bar_y_gap;
//--- ">;I8=0 @0<:8 ?@>3@5AA-10@0
int m_bar_border_width;
//--- &25B 8=48:0B>@0
color m_indicator_color;
//--- !<5I5=85 <5B:8 ?>:070B5;O ?@>F5=B>2
int m_percent_x_gap;
int m_percent_y_gap;
//--- >;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
int m_digits;
//--- >;8G5AB2> H03>2 480?07>=0
double m_steps_total;
//--- "5:CI0O ?>78F8O 8=48:0B>@0
double m_current_index;
//---
public:
CProgressBar(void);
~CProgressBar(void);
//--- 5B>4K 4;O A>740=8O M;5<5=B0
bool CreateProgressBar(const string text,const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const string text,const int x_gap,const int y_gap);
bool CreateCanvas(void);
//---
public:
//--- &25B (1) D>=0 8 (2) @0<:8 ?@>3@5AA-10@0, (3) F25B 8=48:0B>@0
void IndicatorBackColor(const color clr) { m_bar_back_color=clr; }
void IndicatorColor(const color clr) { m_indicator_color=clr; }
//--- (1) ">;I8=0 @0<:8, (2) Y-@07<5@ >1;0AB8 8=48:0B>@0
void BarBorderWidth(const int width) { m_bar_border_width=width; }
void BarYSize(const int y_size) { m_bar_y_size=y_size; }
//--- (1) !<5I5=85 ?@>3@5AA 10@0 ?> 42C< >AO<, (2) A<5I5=85 <5B:8 ?>:070B5;O ?@>F5=B>2
void BarXGap(const int x_gap) { m_bar_x_gap=x_gap; }
void BarYGap(const int y_gap) { m_bar_y_gap=y_gap; }
//--- (1) !<5I5=85 B5:AB>2>9 <5B:8 (?@>F5=B0 ?@>F5AA0), (2) :>;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
void PercentXGap(const int x_gap) { m_percent_x_gap=x_gap; }
void PercentYGap(const int y_gap) { m_percent_y_gap=y_gap; }
void SetDigits(const int digits) { m_digits=::fabs(digits); }
//--- 1=>2;5=85 8=48:0B>@0 ?> C:070==K< 7=0G5=8O<
void Update(const int index,const int total);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- 8AC5B 8=48:0B>@
void DrawIndicator(void);
//--- 8AC5B ?@>F5=B=>5 >B>1@065=85 ?@>3@5AA0
void DrawPercent(void);
//--- #AB0=>2:0 =>2KE 7=0G5=89 4;O 8=48:0B>@0
void CurrentIndex(const int index);
void StepsTotal(const int total);
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CProgressBar::CProgressBar(void) : m_digits(0),
m_steps_total(1),
m_current_index(0),
m_bar_x_gap(0),
m_bar_y_gap(0),
m_bar_border_width(0),
m_percent_x_gap(7),
m_percent_y_gap(0),
m_bar_back_color(C'225,225,225'),
m_indicator_color(clrMediumSeaGreen)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CProgressBar::~CProgressBar(void)
{
}
//+------------------------------------------------------------------+
//| !>740QB M;5<5=B "=48:0B>@ ?@>3@5AA0" |
//+------------------------------------------------------------------+
bool CProgressBar::CreateProgressBar(const string text,const int x_gap,const int y_gap)
{
//--- K9B8, 5A;8 =5B C:070B5;O =0 3;02=K9 M;5<5=B
if(!CElement::CheckMainPointer())
return(false);
//--- =8F80;870F8O A2>9AB2
InitializeProperties(text,x_gap,y_gap);
//--- !>740=85 M;5<5=B0
if(!CreateCanvas())
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CProgressBar::InitializeProperties(const string text,const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_label_text =text;
m_x_size =(m_x_size<1 || m_auto_xresize_mode)? m_main.X2()-m_x-m_auto_xresize_right_offset : m_x_size;
//--- !2>9AB20 ?> C<>;G0=8N
m_back_color =(m_back_color!=clrNONE)? m_back_color : m_main.BackColor();
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack;
m_label_y_gap =(m_label_y_gap!=WRONG_VALUE)? m_label_y_gap : 0;
//--- BABC?K >B :@09=59 B>G:8
CElementBase::XGap(x_gap);
CElementBase::YGap(y_gap);
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CProgressBar::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("progress");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| 1=>2;O5B ?@>3@5AA 10@ |
//+------------------------------------------------------------------+
void CProgressBar::Update(const int index,const int total)
{
//--- #AB0=>28BL =>2K9 8=45:A
CurrentIndex(index);
//--- #AB0=>28BL =>2K9 480?07>=
StepsTotal(total);
//--- 5@5@8A>20BL M;5<5=B
CElement::Update(true);
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CProgressBar::Draw(void)
{
//--- 0@8A>20BL D>=
CElement::DrawBackground();
//--- 0@8A>20BL :0@B8=:C
CElement::DrawImage();
//--- 0@8A>20BL 8=48:0B>@
DrawIndicator();
//--- 0@8A>20BL @0<:C, 5A;8 F25B C:070=
if(m_border_color!=clrNONE)
CElement::DrawBorder();
//--- 0@8A>20BL B5:AB
CElement::DrawText();
//--- 0@8A>20BL ?@>3@5AA 2 ?@>F5=B=>< 2K@065=88
DrawPercent();
}
//+------------------------------------------------------------------+
//| 8AC5B 8=48:0B>@ |
//+------------------------------------------------------------------+
void CProgressBar::DrawIndicator(void)
{
int x1 =m_bar_x_gap;
int y1 =m_bar_y_gap;
int x2 =m_x_size; // -40
int y2 =m_bar_y_gap+m_bar_y_size;
//--- 07<5@ D>=0 8=48:0B>@0
m_bar_x_size=x2-m_bar_x_gap;
//--- 0@8A>20BL D>= 8=48:0B>@0
m_canvas.FillRectangle(x1,y1,x2,y2,::ColorToARGB(m_bar_back_color));
//--- 0AAG8B05< H8@8=C 8=48:0B>@0
double new_width=(m_current_index/m_steps_total)*m_bar_x_size;
//--- !:>@@5:B8@>20BL, 5A;8 <5=LH5 1
if((int)new_width<1)
new_width=1;
else
{
//--- !:>@@5:B8@>20BL A CGQB>< H8@8=K @0<:8
int x_size=m_bar_x_size-(m_bar_border_width*2);
//--- !:>@@5:B8@>20BL, 5A;8 2KE>4 70 3@0=8FC
if((int)new_width>=x_size)
new_width=x_size;
}
//--- #AB0=>28< 8=48:0B>@C =>2CN H8@8=C
x1 =x1+m_bar_border_width;
y1 =y1+m_bar_border_width;
x2 =x1+(int)new_width;
y2 =y2-m_bar_border_width;
//--- 0@8A>20BL 8=48:0B>@
m_canvas.FillRectangle(x1,y1,x2,y2,::ColorToARGB(m_indicator_color));
}
//+------------------------------------------------------------------+
//| 8AC5B ?@>F5=B=>5 >B>1@065=85 ?@>3@5AA0 |
//+------------------------------------------------------------------+
void CProgressBar::DrawPercent(void)
{
int x =m_x_size-m_percent_x_gap;
int y =m_percent_y_gap;
//--- 0AAG8B05< ?@>F5=B 8 AD>@<8@C5< AB@>:C
double percent =m_current_index/m_steps_total*100;
string text =::DoubleToString((percent>100)? 100 : percent,m_digits)+"%";
//--- 0@8A>20BL B5:AB
m_canvas.TextOut(x,y,text,::ColorToARGB(m_label_color),TA_RIGHT);
}
//+------------------------------------------------------------------+
//| >;8G5AB2> H03>2 ?@>3@5AA 10@0 |
//+------------------------------------------------------------------+
void CProgressBar::StepsTotal(const int total)
{
//--- !:>@@5:B8@>20BL, 5A;8 <5=LH5 0
m_steps_total=(total<1)? 1 : total;
//--- !:>@@5:B8@>20BL 8=45:A, 5A;8 2KE>4 87 480?07>=0
if(m_current_index>m_steps_total)
m_current_index=m_steps_total;
}
//+------------------------------------------------------------------+
//| "5:CI0O ?>78F8O 8=48:0B>@0 |
//+------------------------------------------------------------------+
void CProgressBar::CurrentIndex(const int index)
{
//--- !:>@@5:B8@>20BL, 5A;8 <5=LH5 0
if(index<0)
m_current_index=1;
//--- !:>@@5:B8@>20BL 8=45:A, 5A;8 2KE>4 87 480?07>=0
else
m_current_index=(index>m_steps_total)? m_steps_total : index;
}
//+------------------------------------------------------------------+
//| 7<5=8BL H8@8=C ?> ?@02><C :@0N D>@<K |
//+------------------------------------------------------------------+
void CProgressBar::ChangeWidthByRightWindowSide(void)
{
//--- 07<5@K
int x_size=0;
//--- 0AAG8B0BL 8 CAB0=>28BL =>2K9 @07<5@ D>=C M;5<5=B0
x_size=m_main.X2()-m_canvas.X()-m_auto_xresize_right_offset;
CElementBase::XSize(x_size);
m_canvas.XSize(x_size);
m_canvas.Resize(x_size,m_y_size);
//--- 5@5@8A>20BL M;5<5=B
CElementBase::Update(true);
//--- 1=>28BL ?>;>65=85 >1J5:B>2
Moving();
}
//+------------------------------------------------------------------+