EasyAndFastMod/Controls/TextEdit.mqh

602 lines
50 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| TextEdit.mqh |
//| Copyright 2016, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
#include "TextBox.mqh"
class CCalendar;
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O B5:AB>2>3> ?>;O 22>40 |
//+------------------------------------------------------------------+
class CTextEdit : public CElement
{
private:
//--- 1J5:BK 4;O A>740=8O ?>;O 22>40
CTextBox m_edit;
CButton m_button_inc;
CButton m_button_dec;
//--- 568< M;5<5=B0 A G5:-1>:A><
bool m_checkbox_mode;
//--- 568< G8A;>2>3> ?>;O 22>40 A :=>?:0<8
bool m_spin_edit_mode;
//--- "5:CI55 7=0G5=85 2 ?>;5 22>40
string m_edit_value;
//--- 568< A1@>A0 7=0G5=8O (?CAB0O AB@>:0)
bool m_reset_mode;
//--- 8=8<0;L=>5/<0:A8<0;L=>5 7=0G5=85
double m_min_value;
double m_max_value;
//--- (03 4;O 87<5=5=8O 7=0G5=8O 2 ?>;5 22>40
double m_step_value;
//--- !GQBG8: B09<5@0 4;O ?5@5<>B:8 A?8A:0
int m_timer_counter;
//--- >;8G5AB2> 7=0:>2 ?>A;5 70?OB>9
int m_digits;
//---
public:
CTextEdit(void);
~CTextEdit(void);
//--- 5B>4K 4;O A>740=8O B5:AB2>3> ?>;O 22>40
bool CreateTextEdit(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);
bool CreateEdit(void);
bool CreateSpinButton(CButton &button_obj,const int index);
//---
public:
//--- >72@0I05B C:070B5;8 =0 A>AB02=K5 M;5<5=BK
CTextBox *GetTextBoxPointer(void) { return(::GetPointer(m_edit)); }
CButton *GetIncButtonPointer(void) { return(::GetPointer(m_button_inc)); }
CButton *GetDecButtonPointer(void) { return(::GetPointer(m_button_dec)); }
//--- 568< A1@>A0 ?@8 =060B88 =0 B5:AB>2>9 <5B:5
bool ResetMode(void) const { return(m_reset_mode); }
void ResetMode(const bool mode) { m_reset_mode=mode; }
//--- (1) 568<K G5:-1>:A0 8 (2) G8A;>2>3> ?>;O 22>40
void CheckBoxMode(const bool state) { m_checkbox_mode=state; }
bool SpinEditMode(void) const { return(m_spin_edit_mode); }
void SpinEditMode(const bool state) { m_spin_edit_mode=state; }
//--- 8=8<0;L=>5 7=0G5=85
double MinValue(void) const { return(m_min_value); }
void MinValue(const double value) { m_min_value=value; }
//--- 0:A8<0;L=>5 7=0G5=85
double MaxValue(void) const { return(m_max_value); }
void MaxValue(const double value) { m_max_value=value; }
//--- (1) (03 7=0G5=8O, (2) CAB0=>2:0 :>;8G5AB20 7=0:>2 ?>A;5 70?OB>9
double StepValue(void) const { return(m_step_value); }
void StepValue(const double value) { m_step_value=(value<=0)? 1 : value; }
int GetDigits(void) const { return(m_digits); }
void SetDigits(const int digits) { m_digits=::fabs(digits); }
//--- !>AB>O=85 M;5<5=B0 (=060B/>B60B)
bool IsPressed(void) const { return(m_is_pressed); }
void IsPressed(const bool state);
//--- >72@0I5=85 8 CAB0=>2:0 7=0G5=8O ?>;O 22>40
string GetValue(void) { return(m_edit.GetValue(0)); }
void SetValue(const string value,const bool is_size_adjustment=true);
//---
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);
//--- ;>:8@>2:0
virtual void IsLocked(const bool state);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- 1@01>B:0 =060B8O =0 M;5<5=B5
bool OnClickElement(const string clicked_object);
//--- 1@01>B:0 >:>=G0=8O 22>40 7=0G5=8O
bool OnEndEdit(const uint id);
//--- 1@01>B:0 =060B8O :=>?>: ?>;O 22>40
bool OnClickButtonInc(const string pressed_object,const uint id,const uint index);
bool OnClickButtonDec(const string pressed_object,const uint id,const uint index);
//--- #A:>@5==0O ?5@5<>B:0 7=0G5=89 2 ?>;5 22>40
void FastSwitching(void);
//--- >@@5:B8@>2:0 7=0G5=8O
string AdjustmentValue(const double value);
//--- >4A25G820=85 ;8<8B0
void HighlightLimit(void);
//--- 8AC5B :0@B8=:C
virtual void DrawImage(void);
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CTextEdit::CTextEdit(void) : m_edit_value(""),
m_digits(0),
m_min_value(DBL_MIN),
m_max_value(DBL_MAX),
m_step_value(1),
m_reset_mode(false),
m_checkbox_mode(false),
m_spin_edit_mode(false),
m_timer_counter(SPIN_DELAY_MSC)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CTextEdit::~CTextEdit(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>B:0 A>1KB89 |
//+------------------------------------------------------------------+
void CTextEdit::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)
{
//--- @>25@:0 D>:CA0 =04 M;5<5=B0<8
m_edit.MouseFocus(m_mouse.X()>m_edit.X() && m_mouse.X()<m_edit.X2() &&
m_mouse.Y()>m_edit.Y() && m_mouse.Y()<m_edit.Y2());
//--- 5@5@8A>20BL M;5<5=B
if(CheckCrossingBorder())
Update(true);
//---
return;
}
//--- 1@01>B:0 A>1KB8O =060B8O ;52>9 :=>?:8 <KH8 =0 >1J5:B5
if(id==CHARTEVENT_OBJECT_CLICK)
{
//--- 1@01>B:0 =060B8O =0 M;5<5=B5
if(OnClickElement(sparam))
return;
//---
return;
}
//--- 1@01>B:0 22>40 =>2>3> 7=0G5=8O
if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{
//--- 1@01>B:0 =060B8O =0 M;5<5=B5
if(OnEndEdit((uint)lparam))
return;
//---
return;
}
//--- K9B8, 5A;8 >B:;NG5= @568< G8A;>2>3> ?>;O 22>40
if(!m_spin_edit_mode)
return;
//--- 1@01>B:0 A>1KB8O =060B8O ;52>9 :=>?:8 <KH8 =0 >1J5:B5
if(id==CHARTEVENT_CUSTOM+ON_CLICK_BUTTON)
{
//--- 1@01>B:0 =060B8O =0 :=>?:5 8=:@5<5=B0
if(OnClickButtonInc(sparam,(uint)lparam,(uint)dparam))
return;
//--- 1@01>B:0 =060B8O =0 :=>?:5 45:@5<5=B0
if(OnClickButtonDec(sparam,(uint)lparam,(uint)dparam))
return;
//---
return;
}
}
//+------------------------------------------------------------------+
//| "09<5@ |
//+------------------------------------------------------------------+
void CTextEdit::OnEventTimer(void)
{
//--- #A:>@5==0O ?5@5<>B:0 7=0G5=89
FastSwitching();
}
//+------------------------------------------------------------------+
//| !>740QB 3@C??C >1J5:B>2 B5:AB>2>3> ?>;O 22>40 |
//+------------------------------------------------------------------+
bool CTextEdit::CreateTextEdit(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);
if(!CreateEdit())
return(false);
if(!CreateSpinButton(m_button_inc,0))
return(false);
if(!CreateSpinButton(m_button_dec,1))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CTextEdit::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_x_size =(m_x_size<1 || m_auto_xresize_mode)? m_main.X2()-m_x-m_auto_xresize_right_offset : m_x_size;
m_y_size =(m_y_size<1)? 20 : m_y_size;
m_label_text =text;
//--- !2>9AB20 ?> C<>;G0=8N
m_back_color =(m_back_color!=clrNONE)? m_back_color : m_main.BackColor();
m_icon_y_gap =(m_icon_y_gap!=WRONG_VALUE)? m_icon_y_gap : 4;
m_label_x_gap =(m_label_x_gap!=WRONG_VALUE)? m_label_x_gap : (m_checkbox_mode)? 18 : 0;
m_label_y_gap =(m_label_y_gap!=WRONG_VALUE)? m_label_y_gap : 4;
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack;
m_label_color_hover =(m_label_color_hover!=clrNONE)? m_label_color_hover : C'0,120,215';
m_label_color_locked =(m_label_color_locked!=clrNONE)? m_label_color_locked : clrSilver;
m_label_color_pressed =(m_label_color_pressed!=clrNONE)? m_label_color_pressed : clrBlack;
//--- 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 CTextEdit::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("text_edit");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB ?>;5 22>40 |
//+------------------------------------------------------------------+
bool CTextEdit::CreateEdit(void)
{
//--- !>E@0=8BL C:070B5;L 3;02=>3> M;5<5=B0
m_edit.MainPointer(this);
//--- 07<5@K
int x_size=(m_edit.XSize()<1)? 80 : m_edit.XSize();
//--- >>@48=0BK
int x =(m_edit.XGap()<1)? x_size : m_edit.XGap();
int y =0;
//--- A;8 =C65= M;5<5=B A G5:-1>:A><
if(m_checkbox_mode)
{
IconFile(RESOURCE_CHECKBOX_OFF);
IconFileLocked(RESOURCE_CHECKBOX_OFF_LOCKED);
IconFilePressed(RESOURCE_CHECKBOX_ON);
IconFilePressedLocked(RESOURCE_CHECKBOX_ON_LOCKED);
}
//--- #AB0=>28< A2>9AB20 ?5@54 A>740=85<
if(m_index!=WRONG_VALUE)
m_edit.Index(m_index);
//---
m_edit.XSize(x_size);
m_edit.YSize(m_y_size);
m_edit.TextYOffset(5);
m_edit.Font(CElement::Font());
m_edit.FontSize(CElement::FontSize());
m_edit.IsDropdown(CElementBase::IsDropdown());
//--- #AB0=>28< >1J5:B
if(!m_edit.CreateTextBox(x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_edit);
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB :=>?:8 ?>;O 22>40 225@E 8 22=87 |
//+------------------------------------------------------------------+
bool CTextEdit::CreateSpinButton(CButton &button_obj,const int index)
{
//--- !>E@0=8< C:070B5;L =0 3;02=K9 M;5<5=B
button_obj.MainPointer(m_edit);
//--- K9B8, 5A;8 @568< G8A;>2>3> ?>;O 22>40 >B:;NG5=
if(!m_spin_edit_mode)
return(true);
//--- 07<5@K
int x_size=15,y_size=0;
//--- >>@48=0BK
int x=x_size+1,y=0;
//--- $09;K
string file="",file_locked="",file_pressed="";
//--- =>?:0 225@E
if(index==0)
{
y =1;
y_size =m_edit.YSize()/2;
//---
file =(string)RESOURCE_SPIN_INC;
file_locked =(string)RESOURCE_SPIN_INC;
file_pressed =(string)RESOURCE_SPIN_INC;
//---
button_obj.NamePart(button_obj.NamePart()==""? "spin_inc" : button_obj.NamePart());
button_obj.AnchorRightWindowSide(true);
//--- =45:A M;5<5=B0
button_obj.Index((m_index!=WRONG_VALUE)? m_index*2 : 0);
}
//--- =>?:0 2=87
else
{
y =m_button_inc.YGap()+m_button_inc.YSize()-1;
y_size =m_edit.Y2()-m_button_inc.Y2();
//---
file =(string)RESOURCE_SPIN_DEC;
file_locked =(string)RESOURCE_SPIN_DEC;
file_pressed =(string)RESOURCE_SPIN_DEC;
//---
button_obj.NamePart(button_obj.NamePart()==""? "spin_dec" : button_obj.NamePart());
button_obj.AnchorRightWindowSide(true);
button_obj.AnchorBottomWindowSide(true);
//--- =45:A M;5<5=B0
button_obj.Index((m_index!=WRONG_VALUE)? m_button_inc.Index()+1 : 1);
}
//---
color back_color =(button_obj.BackColor()!=clrNONE)? button_obj.BackColor() : m_edit.BackColor();
color back_color_hover =(button_obj.BackColorHover()!=clrNONE)? button_obj.BackColorHover() : C'225,225,225';
color back_color_pressed =(button_obj.BackColorPressed()!=clrNONE)? button_obj.BackColorPressed() : clrLightGray;
//--- #AB0=>28< A2>9AB20 ?5@54 A>740=85<
button_obj.XSize(x_size);
button_obj.YSize(y_size);
button_obj.IconXGap(5);
button_obj.IconYGap(3);
button_obj.BackColor(back_color);
button_obj.BackColorHover(back_color_hover);
button_obj.BackColorLocked(clrLightGray);
button_obj.BackColorPressed(back_color_pressed);
button_obj.BorderColor(back_color);
button_obj.BorderColorHover(back_color_hover);
button_obj.BorderColorLocked(clrLightGray);
button_obj.BorderColorPressed(back_color_pressed);
button_obj.IconFile((uint)file);
button_obj.IconFileLocked((uint)file_locked);
button_obj.CElement::IconFilePressed((uint)file_pressed);
button_obj.CElement::IconFilePressedLocked((uint)file_locked);
button_obj.IsDropdown(CElementBase::IsDropdown());
//--- !>74048< M;5<5=B C?@02;5=8O
if(!button_obj.CreateButton("",x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(button_obj);
return(true);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 A>AB>O=8O M;5<5=B0 (=060B/>B60B) |
//+------------------------------------------------------------------+
void CTextEdit::IsPressed(const bool state)
{
//--- K9B8, 5A;8 (1) M;5<5=B 701;>:8@>20= 8;8 (2) M;5<5=B C65 2 B0:>< A>AB>O=88
if(CElementBase::IsLocked() || m_is_pressed==state)
return;
//--- #AB0=>2:0 A>AB>O=8O
m_is_pressed=state;
//--- #AB0=>28BL A>>B25BAB2CNICN :0@B8=:C
CElement::ChangeImage(0,!m_is_pressed? 0 : 2);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 7=0G5=8O 2 ?>;5 22>40 |
//+------------------------------------------------------------------+
void CTextEdit::SetValue(const string value,const bool is_size_adjustment=true)
{
//--- G8AB8BL ?>;5 22>40
m_edit.ClearTextBox();
//--- >1028BL =>2>5 7=0G5=85
if(!m_spin_edit_mode)
m_edit.AddText(0,value);
else
m_edit.AddText(0,AdjustmentValue(::StringToDouble(value)));
//--- >@@5:B8@>2:0 @07<5@>2 ?>;O 22>40, 5A;8 C:070=>
if(is_size_adjustment)
{
m_edit.CorrectSize();
}
}
//+------------------------------------------------------------------+
//| >@@5:B8@>2:0 7=0G5=8O |
//+------------------------------------------------------------------+
string CTextEdit::AdjustmentValue(const double value)
{
//--- ;O :>@@5:B8@>2:8
double corrected_value=0.0;
//--- !:>@@5:B8@C5< A CG5B>< H030
corrected_value=::MathRound(value/m_step_value)*m_step_value;
//--- @>25@:0 =0 <8=8<C</<0:A8<C<
if(corrected_value<m_min_value)
corrected_value=m_min_value;
if(corrected_value>m_max_value)
corrected_value=m_max_value;
//--- A;8 7=0G5=85 1K;> 87<5=5=>
if(::StringToDouble(m_edit_value)!=corrected_value || m_edit_value=="")
m_edit_value=::DoubleToString(corrected_value,m_digits);
//--- =0G5=85 157 87<5=5=89
return(m_edit_value);
}
//+------------------------------------------------------------------+
//| ;>:8@>2:0 |
//+------------------------------------------------------------------+
void CTextEdit::IsLocked(const bool state)
{
CElement::IsLocked(state);
//--- #AB0=>28BL A>>B25BAB2CNICN :0@B8=:C
CElement::ChangeImage(0,(m_is_locked)? !m_is_pressed? 1 : 3 : !m_is_pressed? 0 : 2);
}
//+------------------------------------------------------------------+
//| 1@01>B:0 =060B8O =0 M;5<5=B5 |
//+------------------------------------------------------------------+
bool CTextEdit::OnClickElement(const string clicked_object)
{
//--- K945<, 5A;8 (1) M;5<5=B 701;>:8@>20= 8;8 (2) GC6>5 8<O >1J5:B0
if(CElementBase::IsLocked() || m_canvas.ChartObjectName()!=clicked_object)
return(false);
//--- A;8 2:;NG5= @568< A1@>A0 7=0G5=8O
if(m_reset_mode)
SetValue("");
//--- A;8 G5:-1>:A 2:;NG5=
if(m_checkbox_mode)
{
//--- 5@5:;NG8BL =0 ?@>B82>?>;>6=>5 A>AB>O=85
IsPressed(!(IsPressed()));
//--- 0@8A>20BL M;5<5=B
Update(true);
//--- B?@028< A>>1I5=85 >1 MB><
::EventChartCustom(m_chart_id,ON_CLICK_CHECKBOX,CElementBase::Id(),CElementBase::Index(),"");
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| 1@01>B:0 =060B8O =0 M;5<5=B5 |
//+------------------------------------------------------------------+
bool CTextEdit::OnEndEdit(const uint id)
{
//--- K945<, 5A;8 845=B8D8:0B>@K =5 A>2?040NB
if(id!=CElementBase::Id())
return(false);
//--- #AB0=>28BL 7=0G5=85
SetValue(m_edit.GetValue());
//--- 1=>28BL ?>;5 22>40
m_edit.Update(true);
return(true);
}
//+------------------------------------------------------------------+
//| 060B85 =0 ?5@5:;NG0B5;L 8=:@5<5=B0 |
//+------------------------------------------------------------------+
bool CTextEdit::OnClickButtonInc(const string pressed_object,const uint id,const uint index)
{
//--- K945<, 5A;8 =060B85 1K;> =5 =0 :=>?:5
if(::StringFind(pressed_object,m_program_name+"_spin_inc")<0)
return(false);
//--- K945<, 5A;8 845=B8D8:0B>@K 8 8=45:AK =5 A>2?040NB
if(id!=CElementBase::Id() || index!=m_button_inc.Index())
return(false);
//--- >;CG8< =>2>5 7=0G5=85
double value=::StringToDouble(m_edit.GetValue())+m_step_value;
//--- #25;8G8< =0 >48= H03 8 ?@>25@8< =0 2KE>4 70 >3@0=8G5=85
SetValue(::DoubleToString(value),false);
//--- B>6<Q< :=>?:C
m_button_inc.IsPressed(false);
//--- 1=>28BL ?>;5 22>40
m_edit.Update(true);
// Aqui agregamos un nuevo evento para INC
::EventChartCustom(m_chart_id,ON_CLICK_INC,CElementBase::Id(),m_button_inc.Index(),"");
return(true);
}
//+------------------------------------------------------------------+
//| 060B85 =0 ?5@5:;NG0B5;L 45:@5<5=B0 |
//+------------------------------------------------------------------+
bool CTextEdit::OnClickButtonDec(const string pressed_object,const uint id,const uint index)
{
//--- K945<, 5A;8 =060B85 1K;> =5 =0 :=>?:5
if(::StringFind(pressed_object,m_program_name+"_spin_dec")<0)
return(false);
//--- K945<, 5A;8 845=B8D8:0B>@K 8 8=45:AK =5 A>2?040NB
if(id!=CElementBase::Id() || index!=m_button_dec.Index())
return(false);
//--- >;CG8< B5:CI55 7=0G5=85
double value=::StringToDouble(m_edit.GetValue())-m_step_value;
//--- #<5=LH8< =0 >48= H03 8 ?@>25@8< =0 2KE>4 70 >3@0=8G5=85
SetValue(::DoubleToString(value),false);
//--- B>6<Q< :=>?:C
m_button_dec.IsPressed(false);
//--- 1=>28BL ?>;5 22>40
m_edit.Update(true);
// Aqui agregamos un nuevo evento para DEC
::EventChartCustom(m_chart_id,ON_CLICK_DEC,CElementBase::Id(),m_button_dec.Index(),"");
return(true);
}
//+------------------------------------------------------------------+
//| #A:>@5==0O ?@><>B:0 7=0G5=8O 2 ?>;5 22>40 |
//+------------------------------------------------------------------+
void CTextEdit::FastSwitching(void)
{
//--- K945<, 5A;8 (1) =5B D>:CA0 =0 M;5<5=B5 8;8 (2) M;5<5=B O2;O5BAO G0ABLN :0;5=40@O
if(!CElementBase::MouseFocus() || dynamic_cast<CCalendar*>(m_main)!=NULL)
return;
//--- 5@=Q< AGQBG8: : ?5@2>=0G0;L=><C 7=0G5=8N, 5A;8 :=>?:0 <KH8 >B60B0
if(!m_mouse.LeftButtonState())
m_timer_counter=SPIN_DELAY_MSC;
//--- A;8 65 :=>?:0 <KH8 =060B0
else
{
//--- #25;8G8< AGQBG8: =0 CAB0=>2;5==K9 8=B5@20;
m_timer_counter+=TIMER_STEP_MSC;
//--- K945<, 5A;8 <5=LH5 =C;O
if(m_timer_counter<0)
return;
//--- >;CG8< B5:CI55 7=0G5=85 2 ?>;5 22>40
double current_value=::StringToDouble(m_edit.GetValue());
//--- A;8 C25;8G8BL
if(m_button_inc.MouseFocus())
{
SetValue(::DoubleToString(current_value+m_step_value),false);
m_edit.Update(true);
//--- B?@028< A>>1I5=85 >1 MB><
::EventChartCustom(m_chart_id,ON_CLICK_INC,CElementBase::Id(),m_button_inc.Index(),"");
}
//--- A;8 C<5=LH8BL
else if(m_button_dec.MouseFocus())
{
SetValue(::DoubleToString(current_value-m_step_value),false);
m_edit.Update(true);
//--- B?@028< A>>1I5=85 >1 MB><
::EventChartCustom(m_chart_id,ON_CLICK_DEC,CElementBase::Id(),m_button_dec.Index(),"");
}
}
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CTextEdit::Draw(void)
{
//--- 0@8A>20BL D>=
CElement::DrawBackground();
//--- 0@8A>20BL :0@B8=:C
CElement::DrawImage();
//--- 0@8A>20BL B5:AB
CElement::DrawText();
}
//+------------------------------------------------------------------+
//| 8AC5B :0@B8=:C |
//+------------------------------------------------------------------+
void CTextEdit::DrawImage(void)
{
//--- K9B8, 5A;8 (1) G5:-1>:A =5 =C65= 8;8 (2) :0@B8=:0 =5 >?@545;5=0
if(!m_checkbox_mode || CElement::IconFile()=="")
return;
//--- ?@545;8< 8=45:A
uint image_index=(m_is_pressed)? 2 : 0;
//--- A;8 M;5<5=B =5 701;>:8@>20=
if(!CElementBase::IsLocked())
{
if(CElementBase::MouseFocus())
image_index=(m_is_pressed)? 2 : 0;
}
else
image_index=(m_is_pressed)? 3 : 1;
//--- #AB0=>28BL A>>B25BAB2CNICN :0@B8=:C
CElement::ChangeImage(0,image_index);
//--- 8AC5< :0@B8=:C
CElement::DrawImage();
}
//+------------------------------------------------------------------+
//| 7<5=8BL H8@8=C ?> ?@02><C :@0N D>@<K |
//+------------------------------------------------------------------+
void CTextEdit::ChangeWidthByRightWindowSide(void)
{
//--- K9B8, 5A;8 2:;NG5= @568< D8:A0F88 : ?@02><C :@0N D>@<K
if(m_anchor_right_window_side)
return;
//--- >>@48=0BK 8 @07<5@K
int x=0,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
Draw();
//--- 1=>28BL ?>;>65=85 >1J5:B>2
Moving();
}
//+------------------------------------------------------------------+