EasyAndFastMod/ElementBase.mqh

345 líneas
39 KiB
MQL5

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| ElementBase.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "Mouse.mqh"
#include "Objects.mqh"
2026-01-15 07:38:32 -05:00
#include "Common.mqh"
2026-01-15 07:23:17 -05:00
//+------------------------------------------------------------------+
//| 07>2K9 :;0AA M;5<5=B0 C?@02;5=8O |
//+------------------------------------------------------------------+
class CElementBase
{
protected:
//--- -:75<?;O@ :;0AA0 4;O ?>;CG5=8O ?0@0<5B@>2 <KH8
CMouse *m_mouse;
//--- -:75<?;O@ :;0AA0 4;O @01>BK A F25B><
CColors m_clr;
//--- -:75<?;O@ :;0AA0 4;O @01>BK A 3@0D8:><
CChart m_chart;
//--- (1) <O :;0AA0 8 (2) ?@>3@0<<K, (3) B8? ?@>3@0<<K
string m_class_name;
string m_program_name;
ENUM_PROGRAM_TYPE m_program_type;
//--- (1) '0ABL 8<5=8 (B8? M;5<5=B0), (2) 8<O M;5<5=B0
string m_name_part;
string m_element_name;
//--- 45=B8D8:0B>@ 8 =><5@ >:=0 3@0D8:0
long m_chart_id;
int m_subwin;
//--- 45=B8D8:0B>@ ?>A;54=53> A>740==>3> M;5<5=B0 C?@02;5=8O
int m_last_id;
//--- 45=B8D8:0B>@ 8 8=45:A M;5<5=B0
int m_id;
int m_index;
//--- >>@48=0BK 8 3@0=8FK
int m_x;
int m_y;
//--- 07<5@
int m_x_size;
int m_y_size;
//--- BABC?K
int m_x_gap;
int m_y_gap;
//--- !>AB>O=8O M;5<5=B0:
bool m_is_tooltip; // 2A?;K20NI0O ?>4A:07:0
bool m_is_visible; // 2848<>ABL
bool m_is_dropdown; // 2K?040NI89 M;5<5=B
bool m_is_locked; // 1;>:8@>2:0
bool m_is_available; // 4>ABC?=>ABL
bool m_is_pressed; // =060B/>B60B
bool m_is_highlighted; // ?>4A25B:0 ?@8 =02545=88
//--- $>:CA :C@A>@0 <KH8
bool m_mouse_focus;
//--- ;O >?@545;5=8O <><5=B0 ?5@5A5G5=8O :C@A>@>< <KH8 3@0=8F M;5<5=B0
bool m_is_mouse_focus;
//--- #3>; 3@0D8:0 8 B>G:0 ?@82O7:8 >1J5:B>2
ENUM_BASE_CORNER m_corner;
ENUM_ANCHOR_POINT m_anchor;
//--- 568< 02B><0B8G5A:>3> 87<5=5=8O @07<5@>2 M;5<5=B0
bool m_auto_xresize_mode;
bool m_auto_yresize_mode;
//--- BABC? >B ?@02>3>/=86=53> :@0O D>@<K 2 @568<5 02B>-87<5=5=8O H8@8=K/2KA>BK M;5<5=B0
int m_auto_xresize_right_offset;
int m_auto_yresize_bottom_offset;
//--- ">G:8 ?@82O7:8 M;5<5=B0 2 ?@02>9 8 =86=59 AB>@>=5 >:=0
bool m_anchor_right_window_side;
bool m_anchor_bottom_window_side;
//---
public:
CElementBase(void);
~CElementBase(void);
//--- (1) !>E@0=O5B 8 (2) 2>72@0I05B C:070B5;L <KH8
void MousePointer(CMouse &object) { m_mouse=::GetPointer(object); }
CMouse *MousePointer(void) const { return(::GetPointer(m_mouse)); }
//--- (1) !>E@0=O5B 8 (2) 2>72@0I05B 8<O :;0AA0
void ClassName(const string class_name) { m_class_name=class_name; }
string ClassName(void) const { return(m_class_name); }
//--- (1) !>E@0=O5B 8 (2) 2>72@0I05B G0ABL 8<5=8 M;5<5=B0
void NamePart(const string name_part) { m_name_part=name_part; }
string NamePart(void) const { return(m_name_part); }
//--- (1) $>@<8@>20=85 8<5=8 >1J5:B0, (2) ?@>25@:0 AB@>:8 =0 A>45@60=85 7=0G8<>9 G0AB8 8<5=8 M;5<5=B0
string ElementName(const string name_part="");
bool CheckElementName(const string object_name);
//--- (1) >;CG5=85 8<5=8 ?@>3@0<<K, (2) ?>;CG5=85 B8?0 ?@>3@0<<K
string ProgramName(void) const { return(m_program_name); }
ENUM_PROGRAM_TYPE ProgramType(void) const { return(m_program_type); }
//--- (1) #AB0=>2:0/?>;CG5=85 =><5@0 >:=0 3@0D8:0, (2) ?>;CG5=85 845=B8D8:0B>@0 3@0D8:0
void SubwindowNumber(const int number) { m_subwin=number; }
int SubwindowNumber(void) const { return(m_subwin); }
long ChartId(void) const { return(m_chart_id); }
//--- 5B>4K 4;O A>E@0=5=8O 8 ?>;CG5=8O id ?>A;54=53> A>740==>3> M;5<5=B0
int LastId(void) const { return(m_last_id); }
void LastId(const int id) { m_last_id=id; }
//--- #AB0=>2:0 8 ?>;CG5=85 845=B8D8:0B>@0 M;5<5=B0
void Id(const int id) { m_id=id; }
int Id(void) const { return(m_id); }
//--- #AB0=>2:0 8 ?>;CG5=85 8=45:A0 M;5<5=B0
void Index(const int index) { m_index=index; }
int Index(void) const { return(m_index); }
//--- >>@48=0BK 8 3@0=8FK
int X(void) const { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) const { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) const { return(m_x+m_x_size); }
int Y2(void) const { return(m_y+m_y_size); }
//--- 07<5@
int XSize(void) const { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) const { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
//--- BABC?K >B :@09=59 B>G:8 (xy)
int XGap(void) const { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) const { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- #3>; 3@0D8:0 8 B>G:0 ?@82O7:8 >1J5:B>2
ENUM_BASE_CORNER Corner(void) const { return(m_corner); }
void Corner(const ENUM_BASE_CORNER corner) { m_corner=corner; }
ENUM_ANCHOR_POINT Anchor(void) const { return(m_anchor); }
void Anchor(const ENUM_ANCHOR_POINT anchor) { m_anchor=anchor; }
//--- A?;K20NI0O ?>4A:07:0
void IsTooltip(const bool state) { m_is_tooltip=state; }
bool IsTooltip(void) const { return(m_is_tooltip); }
//--- !>AB>O=85 2848<>AB8 M;5<5=B0
void IsVisible(const bool state) { m_is_visible=state; }
bool IsVisible(void) const { return(m_is_visible); }
//--- @87=0: 2K?040NI53> M;5<5=B0
void IsDropdown(const bool state) { m_is_dropdown=state; }
bool IsDropdown(void) const { return(m_is_dropdown); }
//--- !=OB85 8 1;>:8@>2:0 M;5<5=B0
virtual void IsLocked(const bool state) { m_is_locked=state; }
bool IsLocked(void) const { return(m_is_locked); }
//--- @87=0: 4>ABC?=>3> M;5<5=B0
virtual void IsAvailable(const bool state) { m_is_available=state; }
bool IsAvailable(void) const { return(m_is_available); }
//--- @87=0: =060B>3> M;5<5=B0
virtual void IsPressed(const bool state) { m_is_pressed=state; }
bool IsPressed(void) const { return(m_is_pressed); }
//--- @87=0: ?>4A25G8205<>3> M;5<5=B0
void IsHighlighted(const bool state) { m_is_highlighted=state; }
bool IsHighlighted(void) const { return(m_is_highlighted); }
//--- (1) $>:CA, (2) <><5=B 2E>40/2KE>40 2/87 D>:CA0
bool MouseFocus(void) const { return(m_mouse_focus); }
void MouseFocus(const bool focus) { m_mouse_focus=focus; }
bool IsMouseFocus(void) const { return(m_is_mouse_focus); }
void IsMouseFocus(const bool focus) { m_is_mouse_focus=focus; }
//--- (1) 568< 02B>-87<5=5=8O H8@8=K M;5<5=B0, (2) ?>;CG5=85/CAB0=>2:0 >BABC?0 >B ?@02>3> :@0O D>@<K
bool AutoXResizeMode(void) const { return(m_auto_xresize_mode); }
void AutoXResizeMode(const bool flag) { m_auto_xresize_mode=flag; }
int AutoXResizeRightOffset(void) const { return(m_auto_xresize_right_offset); }
void AutoXResizeRightOffset(const int offset) { m_auto_xresize_right_offset=offset; }
//--- (1) 568< 02B>-87<5=5=8O 2KA>BK M;5<5=B0, (2) ?>;CG5=85/CAB0=>2:0 >BABC?0 >B =86=53> :@0O D>@<K
bool AutoYResizeMode(void) const { return(m_auto_yresize_mode); }
void AutoYResizeMode(const bool flag) { m_auto_yresize_mode=flag; }
int AutoYResizeBottomOffset(void) const { return(m_auto_yresize_bottom_offset); }
void AutoYResizeBottomOffset(const int offset) { m_auto_yresize_bottom_offset=offset; }
//--- 568< (?>;CG5=85/CAB0=>2:0) ?@82O7:8 M;5<5=B0 : (1) ?@02><C 8 (2) =86=5<C :@0N >:=0
bool AnchorRightWindowSide(void) const { return(m_anchor_right_window_side); }
void AnchorRightWindowSide(const bool flag) { m_anchor_right_window_side=flag; }
bool AnchorBottomWindowSide(void) const { return(m_anchor_bottom_window_side); }
void AnchorBottomWindowSide(const bool flag) { m_anchor_bottom_window_side=flag; }
//---
public:
//--- 1@01>BG8: A>1KB89 3@0D8:0
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) {}
//--- "09<5@
virtual void OnEventTimer(void) {}
//--- 5@5<5I5=85 M;5<5=B0
virtual void Moving(const bool only_visible=true) {}
//--- (1) >:07, (2) A:@KB85, (3) ?5@5<5I5=85 =0 25@E=89 A;>9, (4) C40;5=85
virtual void Show(void) {}
virtual void Hide(void) {}
virtual void Reset(void) {}
virtual void Delete(void) {}
//--- (1) #AB0=>2:0, (2) A1@>A ?@8>@8B5B>2 =0 =068B85 ;52>9 :=>?:8 <KH8
virtual void SetZorders(void) {}
virtual void ResetZorders(void) {}
//--- !1@>A F25B0 M;5<5=B0
virtual void ResetColors(void) {}
//--- 1=>2;O5B M;5<5=B 4;O >B>1@065=8O ?>A;54=8E 87<5=5=89
virtual void Update(const bool redraw=false) {}
//--- 1=>2;O5B M;5<5=B 4;O >B>1@065=8O ?>A;54=8E 87<5=5=89
virtual void Draw(void) {}
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void) {}
//--- 7<5=8BL 2KA>BC ?> =86=5<C :@0N >:=0
virtual void ChangeHeightByBottomWindowSide(void) {}
//--- @>25@:0 @0A?>;>65=8O :C@A>@0 <KH8 2 ?>4>:=5 ?@>3@0<<K
bool CheckSubwindowNumber(void);
//--- @>25@:0 @0A?>;>65=8O :C@A>@0 <KH8 =04 M;5<5=B><
void CheckMouseFocus(void);
//--- @>25@:0 ?5@5A5G5=8O 3@0=8F M;5<5=B0
bool CheckCrossingBorder(void);
//---
protected:
//--- >;CG5=85 845=B8D8:0B>@0 87 8<5=8 :=>?:8
int IdFromObjectName(const string object_name);
//--- >;CG5=85 8=45:A0 87 8<5=8 ?C=:B0 <5=N
int IndexFromObjectName(const string object_name);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CElementBase::CElementBase(void) : m_program_name(PROGRAM_NAME),
m_program_type(PROGRAM_TYPE),
m_class_name(""),
m_name_part(""),
m_last_id(0),
m_x(0),
m_y(0),
m_x_size(0),
m_y_size(0),
m_x_gap(0),
m_y_gap(0),
m_is_tooltip(false),
m_is_visible(true),
m_is_dropdown(false),
m_is_locked(false),
m_is_pressed(false),
m_is_available(true),
m_is_highlighted(true),
m_mouse_focus(false),
m_is_mouse_focus(false),
m_id(WRONG_VALUE),
m_index(WRONG_VALUE),
m_corner(CORNER_LEFT_UPPER),
m_anchor(ANCHOR_LEFT_UPPER),
m_auto_xresize_mode(false),
m_auto_yresize_mode(false),
m_auto_xresize_right_offset(0),
m_auto_yresize_bottom_offset(0),
m_anchor_right_window_side(false),
m_anchor_bottom_window_side(false)
{
//--- >;CG8< ID B5:CI53> 3@0D8:0
m_chart.Attach();
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CElementBase::~CElementBase(void)
{
//--- BA>548=8BLAO >B 3@0D8:0
m_chart.Detach();
}
//+------------------------------------------------------------------+
//| >72@0I05B AD>@<8@>20==>5 8<O M;5<5=B0 |
//+------------------------------------------------------------------+
string CElementBase::ElementName(const string name_part="")
{
m_name_part=(m_name_part!="")? m_name_part : name_part;
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name="";
if(m_index==WRONG_VALUE)
name=m_program_name+"_"+m_name_part+"_"+(string)CElementBase::Id();
else
name=m_program_name+"_"+m_name_part+"_"+(string)CElementBase::Index()+"__"+(string)CElementBase::Id();
//---
return(name);
}
//+------------------------------------------------------------------+
//| >72@0I05B AD>@<8@>20==>5 8<O M;5<5=B0 |
//+------------------------------------------------------------------+
bool CElementBase::CheckElementName(const string object_name)
{
//--- A;8 =060B85 1K;> =5 =0 MB>< M;5<5=B5
if(::StringFind(object_name,m_program_name+"_"+m_name_part+"_")<0)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| @>25@:0 @0A?>;>65=8O :C@A>@0 <KH8 2 ?>4>:=5 ?@>3@0<<K |
//+------------------------------------------------------------------+
bool CElementBase::CheckSubwindowNumber(void)
{
return(m_subwin==m_mouse.SubWindowNumber());
}
//+------------------------------------------------------------------+
//| @>25@:0 @0A?>;>65=8O :C@A>@0 <KH8 =04 M;5<5=B>< |
//+------------------------------------------------------------------+
void CElementBase::CheckMouseFocus(void)
{
m_mouse_focus=m_mouse.X()>X() && m_mouse.X()<=X2() && m_mouse.Y()>Y() && m_mouse.Y()<=Y2();
}
//+------------------------------------------------------------------+
//| @>25@:0 ?5@5A5G5=8O 3@0=8F M;5<5=B0 |
//+------------------------------------------------------------------+
bool CElementBase::CheckCrossingBorder(void)
{
//--- A;8 MB> <><5=B ?5@5A5G5=8O 3@0=8F M;5<5=B0
if((MouseFocus() && !IsMouseFocus()) || (!MouseFocus() && IsMouseFocus()))
{
IsMouseFocus(MouseFocus());
//--- !>>1I5=85 > ?5@5A5G5=88 2 M;5<5=B
if(MouseFocus())
::EventChartCustom(m_chart_id,ON_MOUSE_FOCUS,m_id,m_index,m_class_name);
//--- !>>1I5=85 > ?5@5A5G5=88 87 M;5<5=B0
else
::EventChartCustom(m_chart_id,ON_MOUSE_BLUR,m_id,m_index,m_class_name);
//---
return(true);
}
//---
return(false);
}
//+------------------------------------------------------------------+
//| 72;5:05B 845=B8D8:0B>@ 87 8<5=8 >1J5:B0 |
//+------------------------------------------------------------------+
int CElementBase::IdFromObjectName(const string object_name)
{
//--- >;CG8< id 87 8<5=8 >1J5:B0
int length =::StringLen(object_name);
int pos =::StringFind(object_name,"__",0);
string id =::StringSubstr(object_name,pos+2,length-1);
//--- 5@=CBL id ?C=:B0
return((int)id);
}
//+------------------------------------------------------------------+
//| 72;5:05B 8=45:A 87 8<5=8 >1J5:B0 |
//+------------------------------------------------------------------+
int CElementBase::IndexFromObjectName(const string object_name)
{
ushort u_sep=0;
string result[];
int array_size=0;
//--- >;CG8< :>4 @0745;8B5;O
u_sep=::StringGetCharacter("_",0);
//--- 07>1LQ< AB@>:C
::StringSplit(object_name,u_sep,result);
array_size=::ArraySize(result)-1;
//--- @>25@:0 2KE>40 70 480?07>= <0AA820
if(array_size-2<0)
{
::Print(PREVENTING_OUT_OF_RANGE);
return(WRONG_VALUE);
}
//--- 5@=CBL 8=45:A ?C=:B0
return((int)result[array_size-2]);
}
//+------------------------------------------------------------------+