EasyAndFastMod/Controls/Tooltip.mqh

277 lines
21 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Tooltip.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O 2A?;K20NI59 ?>4A:07:8 |
//+------------------------------------------------------------------+
class CTooltip : public CElement
{
private:
//--- #:070B5;L =0 M;5<5=B, : :>B>@><C ?@8A>548=5=0 2A?;K20NI0O ?>4A:07:0
CElement *m_element;
//--- "5:AB 8 F25B 703>;>2>:0
string m_header_text;
color m_header_color;
//--- 0AA82 AB@>: B5:AB0 ?>4A:07:8
string m_tooltip_lines[];
//---
public:
CTooltip(void);
~CTooltip(void);
//--- 5B>4K 4;O A>740=8O 2A?;K20NI59 ?>4A:07:8
bool CreateTooltip(void);
//---
private:
void InitializeProperties(void);
bool CreateCanvas(void);
//---
public:
//--- (1) !>E@0=O5B C:070B5;L M;5<5=B0, (2) 703>;>2>: 2A?;K20NI59 ?>4A:07:8
void ElementPointer(CElement &object) { m_element=::GetPointer(object); }
void HeaderText(const string text) { m_header_text=text; }
void HeaderColor(const color clr) { m_header_color=clr; }
//--- >102;O5B AB@>:C 4;O ?>4A:07:8
void AddString(const string text);
//--- (1) >:07K205B 8 (2) A:@K205B 2A?;K20NICN ?>4A:07:C
void ShowTooltip(void);
void FadeOutTooltip(void);
//---
public:
//--- 1@01>BG8: A>1KB89 3@0D8:0
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- #?@02;5=85
virtual void Reset(void);
virtual void Delete(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CTooltip::CTooltip(void) : m_header_text(""),
m_header_color(C'50,50,50')
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElement::ClassName(CLASS_NAME);
//--- 7=0G0;L=> ?>;=>ABLN ?@>7@0G=0
CElement::Alpha(0);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CTooltip::~CTooltip(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>BG8: A>1KB89 3@0D8:0 |
//+------------------------------------------------------------------+
void CTooltip::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- 1@01>B:0 A>1KB8O ?5@5<5I5=8O :C@A>@0
if(id==CHARTEVENT_MOUSE_MOVE)
{
//--- K9B8, 5A;8 M;5<5=B A:@KB
if(!CElement::IsVisible())
return;
//--- K9B8, 5A;8 :=>?:0 2A?;K20NI8E ?>4A:07>: =0 D>@<5 >B:;NG5=0
if(!m_wnd.IsTooltip())
return;
//--- A;8 D>@<0 701;>:8@>20=0, A:@KBL ?>4A:07:C
if(m_main.CElementBase::IsLocked())
{
FadeOutTooltip();
return;
}
//--- A;8 5ABL D>:CA =0 M;5<5=B5, ?>:070BL ?>4A:07:C
if(m_element.MouseFocus())
ShowTooltip();
//--- A;8 =5B D>:CA0, A:@KBL ?>4A:07:C
else
FadeOutTooltip();
//---
return;
}
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B Tooltip |
//+------------------------------------------------------------------+
bool CTooltip::CreateTooltip(void)
{
//--- K9B8, 5A;8 =5B C:070B5;O =0 3;02=K9 M;5<5=B
if(!CElement::CheckMainPointer())
return(false);
//--- K9B8, 5A;8 =5B C:070B5;O =0 M;5<5=B
if(::CheckPointer(m_element)==POINTER_INVALID)
{
::Print(__FUNCTION__," > 5@54 A>740=85< 2A?;K20NI59 ?>4A:07:8 :;0AAC =C6=> ?5@540BL "
"C:070B5;L =0 M;5<5=B: CTooltip::ElementPointer(CElement &object).");
return(false);
}
//--- =8F80;870F8O A2>9AB2
InitializeProperties();
//--- !>740QB 2A?;K20NICN ?>4A:07:C
if(!CreateCanvas())
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CTooltip::InitializeProperties(void)
{
m_x =CElement::CalculateX(m_element.XGap());
m_y =CElement::CalculateY(m_element.YGap()+m_element.YSize()+1);
m_x_size =(m_x_size<1)? 100 : m_x_size;
m_y_size =(m_y_size<1)? 50 : m_y_size;
//--- &25B0 ?> C<>;G0=8N
m_border_color =(m_border_color!=clrNONE)? m_border_color : C'150,170,180';
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrDimGray;
//--- BABC?K >B :@09=59 B>G:8
CElement::XGap(CElement::CalculateXGap(m_x));
CElement::YGap(CElement::CalculateYGap(m_y));
}
//+------------------------------------------------------------------+
//| !>740QB E>;AB 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CTooltip::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("tooltip");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//--- G8AB:0 E>;AB0 4;O @8A>20=8O
m_canvas.Erase(::ColorToARGB(clrNONE,0));
m_canvas.Update();
//--- 1=C;8BL ?@8>@8B5B =0 =060B85
Z_Order(WRONG_VALUE);
return(true);
}
//+------------------------------------------------------------------+
//| >102;O5B AB@>:C |
//+------------------------------------------------------------------+
void CTooltip::AddString(const string text)
{
//--- #25;8G8< @07<5@ <0AA82>2 =0 >48= M;5<5=B
int array_size=::ArraySize(m_tooltip_lines);
::ArrayResize(m_tooltip_lines,array_size+1);
//--- !>E@0=8< 7=0G5=8O ?5@540==KE ?0@0<5B@>2
m_tooltip_lines[array_size]=text;
}
//+------------------------------------------------------------------+
//| B>1@0605B 2A?;K20NICN ?>4A:07:C |
//+------------------------------------------------------------------+
void CTooltip::ShowTooltip(void)
{
//--- K9B8, 5A;8 ?>4A:07:0 284=0 =0 100%
if(m_alpha>=255)
return;
//--- >>@48=0BK 8 >BABC? 4;O 703>;>2:0
int x=5,y=5;
int y_offset=15;
//--- @87=0: ?>;=>ABLN 2848<>9 ?>4A:07:8
m_alpha=255;
//--- 8AC5< D>= 8 @0<:C
DrawBackground();
DrawBorder();
//--- 8AC5< 703>;>2>: (5A;8 CAB0=>2;5=)
if(m_header_text!="")
{
//--- #AB0=>28< ?0@0<5B@K H@8DB0
m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_BLACK);
//--- 8AC5< B5:AB 703>;>2:0
m_canvas.TextOut(x,y,m_header_text,::ColorToARGB(m_header_color),TA_LEFT|TA_TOP);
}
//--- >>@48=0BK 4;O >A=>2=>3> B5:AB0 ?>4A:07:8 (A CGQB>< =0;8G8O 703>;>2:0)
x =(m_header_text!="")? 15 : 5;
y =(m_header_text!="")? 25 : 5;
//--- #AB0=>28< ?0@0<5B@K H@8DB0
m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_THIN);
//--- 8AC5< >A=>2=>9 B5:AB ?>4A:07:8
int lines_total=::ArraySize(m_tooltip_lines);
for(int i=0; i<lines_total; i++)
{
m_canvas.TextOut(x,y,m_tooltip_lines[i],::ColorToARGB(m_label_color),TA_LEFT|TA_TOP);
y=y+y_offset;
}
//--- 1=>28BL E>;AB
m_canvas.Update();
}
//+------------------------------------------------------------------+
//| ;02=>5 8AG57=>25=85 2A?;K20NI59 ?>4A:07:8 |
//+------------------------------------------------------------------+
void CTooltip::FadeOutTooltip(void)
{
//--- K9B8, 5A;8 ?>4A:07:0 A:@KB0 =0 100%
if(m_alpha<1)
return;
//--- BABC? 4;O 703>;>2:0
int y_offset=15;
//--- (03 ?@>7@0G=>AB8
uchar fadeout_step=7;
//--- 0G0;L=>5 7=0G5=85
uchar alpha=m_alpha;
//--- ;02=>5 8AG57=>25=85 ?>4A:07:8
for(uchar a=alpha; a>=0; a-=fadeout_step)
{
m_alpha=a;
//--- A;8 A;54CNI89 H03 2 <8=CA, >AB0=>28< F8:;
if(a-fadeout_step<0)
{
m_alpha=0;
m_canvas.Erase(::ColorToARGB(clrNONE,m_alpha));
m_canvas.Update();
break;
}
//--- >>@48=0BK 4;O 703>;>2:0
int x=5,y=5;
//--- 8AC5< D>= 8 @0<:C
DrawBackground();
DrawBorder();
//--- 8AC5< 703>;>2>: (5A;8 CAB0=>2;5=)
if(m_header_text!="")
{
//--- #AB0=>28< ?0@0<5B@K H@8DB0
m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_BLACK);
//--- 8AC5< B5:AB 703>;>2:0
m_canvas.TextOut(x,y,m_header_text,::ColorToARGB(m_header_color,m_alpha),TA_LEFT|TA_TOP);
}
//--- >>@48=0BK 4;O >A=>2=>3> B5:AB0 ?>4A:07:8 (A CGQB>< =0;8G8O 703>;>2:0)
x =(m_header_text!="")? 15 : 5;
y =(m_header_text!="")? 25 : 5;
//--- #AB0=>28< ?0@0<5B@K H@8DB0
m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_THIN);
//--- 8AC5< >A=>2=>9 B5:AB ?>4A:07:8
int lines_total=::ArraySize(m_tooltip_lines);
for(int i=0; i<lines_total; i++)
{
m_canvas.TextOut(x,y,m_tooltip_lines[i],::ColorToARGB(m_label_color,m_alpha),TA_LEFT|TA_TOP);
y=y+y_offset;
}
//--- 1=>28BL E>;AB
m_canvas.Update();
}
}
//+------------------------------------------------------------------+
//| 5@5@8A>2:0 |
//+------------------------------------------------------------------+
void CTooltip::Reset(void)
{
Hide();
Show();
}
//+------------------------------------------------------------------+
//| #40;5=85 |
//+------------------------------------------------------------------+
void CTooltip::Delete(void)
{
//--- #40;5=85 >1J5:B>2
CElement::Delete();
//--- A2>1>645=85 <0AA82>2 M;5<5=B0
::ArrayFree(m_tooltip_lines);
}
//+------------------------------------------------------------------+