Article-18221-MQL5-MVC-Simp.../iTestLabel.mq5

401 Zeilen
20 KiB
MQL5

2026-03-30 08:39:19 +07:00
//+------------------------------------------------------------------+
//| iTestLabel.mq5 |
//| Copyright 2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Включаемые библиотеки |
//+------------------------------------------------------------------+
#include <Arrays\ArrayObj.mqh>
#include "Controls\Controls.mqh"
CArrayObj list; // Список для хранения тестируемых объектов
CCanvasBase *base =NULL; // Указатель на базовый графический элемент
CLabel *label1=NULL; // Указатель на графический элемент Label
CLabel *label2=NULL; // Указатель на графический элемент Label
CLabel *label3=NULL; // Указатель на графический элемент Label
CButton *button1=NULL; // Указатель на графический элемент Button
CButtonTriggered *button_t1=NULL; // Указатель на графический элемент ButtonTriggered
CButtonTriggered *button_t2=NULL; // Указатель на графический элемент ButtonTriggered
CButtonArrowUp *button_up=NULL; // Указатель на графический элемент CButtonArrowUp
CButtonArrowDown *button_dn=NULL; // Указатель на графический элемент CButtonArrowDown
CButtonArrowLeft *button_lt=NULL; // Указатель на графический элемент CButtonArrowLeft
CButtonArrowRight*button_rt=NULL; // Указатель на графический элемент CButtonArrowRight
CCheckBox *checkbox_lt=NULL; // Указатель на графический элемент CCheckBox
CCheckBox *checkbox_rt=NULL; // Указатель на графический элемент CCheckBox
CRadioButton *radio_bt_lt=NULL; // Указатель на графический элемент CRadioButton
CRadioButton *radio_bt_rt=NULL; // Указатель на графический элемент CRadioButton
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Ищем подокно графика
int wnd=ChartWindowFind();
//--- Создаём базовый графический элемент
list.Add(base=new CCanvasBase("Rectangle",0,wnd,100,40,260,160));
base.SetAlphaBG(250); // Прозрачность
base.SetBorderWidth(6); // Ширина рамки
//--- Инициализируем цвет фона, указываем цвет для заблокированного элемента
//--- и делаем текущим цветом фона элемента цвет фона, заданный по умолчанию
base.InitBackColors(clrWhiteSmoke);
base.InitBackColorBlocked(clrLightGray);
base.BackColorToDefault();
//--- Заливаем цветом фон и рисуем рамку с отступом в один пиксель от установленной ширины рамки
base.Fill(base.BackColor(),false);
uint wd=base.BorderWidth();
base.GetBackground().Rectangle(0,0,base.Width()-1,base.Height()-1,ColorToARGB(clrDimGray));
base.GetBackground().Rectangle(wd-2,wd-2,base.Width()-wd+1,base.Height()-wd+1,ColorToARGB(clrLightGray));
base.Update(false);
//--- Устанавливаем наименование и идентификатор элемента и выводим в журнал его описание
base.SetName("Rectangle 1");
base.SetID(1);
base.Print();
//--- Внутри базового объекта создаём текстовую метку
//--- и указываем для метки в качестве контейнера базовый элемент
string text="Simple button:";
int shift_x=20;
int shift_y=8;
int x=base.X()+shift_x-10;
int y=base.Y()+shift_y+2;
int w=base.GetForeground().TextWidth(text);
int h=DEF_LABEL_H;
list.Add(label1=new CLabel("Label 1",0,wnd,text,x,y,w,h));
label1.SetContainerObj(base);
//--- Устанавливаем цвет при наведении курсора и щелчке по элементу как красный
//--- (это изменение стандартных параметров текстовой метки после её создания).
label1.InitForeColorFocused(clrRed);
label1.InitForeColorPressed(clrRed);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
label1.SetID(2);
label1.Draw(false);
label1.Print();
//--- Внутри базового объекта создаём простую кнопку
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=label1.Right()+shift_x;
y=label1.Y();
w=DEF_BUTTON_W;
h=DEF_BUTTON_H;
list.Add(button1=new CButton("Simple Button",0,wnd,"Button 1",x,y,w,h));
button1.SetContainerObj(base);
//--- Задаём смещение текста кнопки по оси X
button1.SetTextShiftH(2);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
button1.SetID(3);
button1.Draw(false);
button1.Print();
//--- Внутри базового объекта создаём текстовую метку
//--- и указываем для метки в качестве контейнера базовый элемент
text="Triggered button:";
x=label1.X();
y=label1.Bottom()+shift_y;
w=base.GetForeground().TextWidth(text);
h=DEF_LABEL_H;
list.Add(label2=new CLabel("Label 2",0,wnd,text,x,y,w,h));
label2.SetContainerObj(base);
//--- Устанавливаем цвет при наведении курсора и щелчке по элементу как красный
//--- (это изменение стандартных параметров текстовой метки после её создания).
label2.InitForeColorFocused(clrRed);
label2.InitForeColorPressed(clrRed);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
label2.SetID(4);
label2.Draw(false);
label2.Print();
//--- Внутри базового объекта создаём двухпозиционную кнопку
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=button1.X();
y=button1.Bottom()+shift_y;
w=DEF_BUTTON_W;
h=DEF_BUTTON_H;
list.Add(button_t1=new CButtonTriggered("Triggered Button 1",0,wnd,"Button 2",x,y,w,h));
button_t1.SetContainerObj(base);
//--- Задаём смещение текста кнопки по оси X
button_t1.SetTextShiftH(2);
//--- Устанавливаем идентификатор и активированное состояние элемента,
//--- рисуем элемент и выводим в журнал его описание.
button_t1.SetID(5);
button_t1.SetState(true);
button_t1.Draw(false);
button_t1.Print();
//--- Внутри базового объекта создаём двухпозиционную кнопку
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=button_t1.Right()+4;
y=button_t1.Y();
w=DEF_BUTTON_W;
h=DEF_BUTTON_H;
list.Add(button_t2=new CButtonTriggered("Triggered Button 2",0,wnd,"Button 3",x,y,w,h));
button_t2.SetContainerObj(base);
//--- Задаём смещение текста кнопки по оси X
button_t2.SetTextShiftH(2);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
button_t2.SetID(6);
button_t2.Draw(false);
button_t2.Print();
//--- Внутри базового объекта создаём текстовую метку
//--- и указываем для метки в качестве контейнера базовый элемент
text="Arrowed buttons:";
x=label1.X();
y=label2.Bottom()+shift_y;
w=base.GetForeground().TextWidth(text);
h=DEF_LABEL_H;
list.Add(label3=new CLabel("Label 3",0,wnd,text,x,y,w,h));
label3.SetContainerObj(base);
//--- Устанавливаем цвет при наведении курсора и щелчке по элементу как красный
//--- (это изменение стандартных параметров текстовой метки после её создания).
label3.InitForeColorFocused(clrRed);
label3.InitForeColorPressed(clrRed);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
label3.SetID(7);
label3.Draw(false);
label3.Print();
//--- Внутри базового объекта создаём кнопку со стрелкой вверх
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=button1.X();
y=button_t1.Bottom()+shift_y;
w=DEF_BUTTON_H-1;
h=DEF_BUTTON_H-1;
list.Add(button_up=new CButtonArrowUp("Arrow Up Button",0,wnd,x,y,w,h));
button_up.SetContainerObj(base);
//--- Задаём размеры и смещение изображения по оси X
button_up.SetImageBound(1,1,w-4,h-3);
//--- Здесь можно настроить внешний вид кнопки, например, убрать рамку
//button_up.InitBorderColors(button_up.BackColor(),button_up.BackColorFocused(),button_up.BackColorPressed(),button_up.BackColorBlocked());
//button_up.ColorsToDefault();
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
button_up.SetID(8);
button_up.Draw(false);
button_up.Print();
//--- Внутри базового объекта создаём кнопку со стрелкой вниз
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=button_up.Right()+4;
y=button_up.Y();
w=DEF_BUTTON_H-1;
h=DEF_BUTTON_H-1;
list.Add(button_dn=new CButtonArrowDown("Arrow Down Button",0,wnd,x,y,w,h));
button_dn.SetContainerObj(base);
//--- Задаём размеры и смещение изображения по оси X
button_dn.SetImageBound(1,1,w-4,h-3);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
button_dn.SetID(9);
button_dn.Draw(false);
button_dn.Print();
//--- Внутри базового объекта создаём кнопку со стрелкой влево
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=button_dn.Right()+4;
y=button_up.Y();
w=DEF_BUTTON_H-1;
h=DEF_BUTTON_H-1;
list.Add(button_lt=new CButtonArrowLeft("Arrow Left Button",0,wnd,x,y,w,h));
button_lt.SetContainerObj(base);
//--- Задаём размеры и смещение изображения по оси X
button_lt.SetImageBound(1,1,w-3,h-4);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
button_lt.SetID(10);
button_lt.Draw(false);
button_lt.Print();
//--- Внутри базового объекта создаём кнопку со стрелкой вправо
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=button_lt.Right()+4;
y=button_up.Y();
w=DEF_BUTTON_H-1;
h=DEF_BUTTON_H-1;
list.Add(button_rt=new CButtonArrowRight("Arrow Right Button",0,wnd,x,y,w,h));
button_rt.SetContainerObj(base);
//--- Задаём размеры и смещение изображения по оси X
button_rt.SetImageBound(1,1,w-3,h-4);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
button_rt.SetID(11);
button_rt.Draw(false);
button_rt.Print();
//--- Внутри базового объекта создаём чекбокс с заголовком справа (левый чекбокс)
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=label1.X();
y=label3.Bottom()+shift_y;
w=DEF_BUTTON_W+30;
h=DEF_BUTTON_H;
list.Add(checkbox_lt=new CCheckBox("CheckBoxL",0,wnd,"CheckBox L",x,y,w,h));
checkbox_lt.SetContainerObj(base);
//--- Задаём координаты и размеры области изображения
checkbox_lt.SetImageBound(2,1,h-2,h-2);
//--- Задаём смещение текста кнопки по оси X
checkbox_lt.SetTextShiftH(checkbox_lt.ImageRight()+2);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
checkbox_lt.SetID(12);
checkbox_lt.Draw(false);
checkbox_lt.Print();
//--- Внутри базового объекта создаём чекбокс с заголовком слева (правый чекбокс)
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=checkbox_lt.Right()+4;
y=checkbox_lt.Y();
w=DEF_BUTTON_W+30;
h=DEF_BUTTON_H;
list.Add(checkbox_rt=new CCheckBox("CheckBoxR",0,wnd,"CheckBox R",x,y,w,h));
checkbox_rt.SetContainerObj(base);
//--- Задаём координаты и размеры области изображения
checkbox_rt.SetTextShiftH(2);
//--- Задаём смещение текста кнопки по оси X
checkbox_rt.SetImageBound(checkbox_rt.Width()-h+2,1,h-2,h-2);
//--- Устанавливаем идентификатор и активированное состояние элемента,
//--- рисуем элемент и выводим в журнал его описание.
checkbox_rt.SetID(13);
checkbox_rt.SetState(true);
checkbox_rt.Draw(false);
checkbox_rt.Print();
//--- Внутри базового объекта создаём радиокнопку с заголовком справа (левый RadioButton)
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=checkbox_lt.X();
y=checkbox_lt.Bottom()+shift_y;
w=DEF_BUTTON_W+46;
h=DEF_BUTTON_H;
list.Add(radio_bt_lt=new CRadioButton("RadioButtonL",0,wnd,"RadioButton L",x,y,w,h));
radio_bt_lt.SetContainerObj(base);
//--- Задаём координаты и размеры области изображения
radio_bt_lt.SetImageBound(2,1,h-2,h-2);
//--- Задаём смещение текста кнопки по оси X
radio_bt_lt.SetTextShiftH(radio_bt_lt.ImageRight()+2);
//--- Устанавливаем идентификатор и активированное состояние элемента,
//--- рисуем элемент и выводим в журнал его описание.
radio_bt_lt.SetID(14);
radio_bt_lt.SetState(true);
radio_bt_lt.Draw(false);
radio_bt_lt.Print();
//--- Внутри базового объекта создаём радиокнопку с заголовком слева (правый RadioButton)
//--- и указываем для кнопки в качестве контейнера базовый элемент
x=radio_bt_lt.Right()+4;
y=radio_bt_lt.Y();
w=DEF_BUTTON_W+46;
h=DEF_BUTTON_H;
list.Add(radio_bt_rt=new CRadioButton("RadioButtonR",0,wnd,"RadioButton R",x,y,w,h));
radio_bt_rt.SetContainerObj(base);
//--- Задаём смещение текста кнопки по оси X
radio_bt_rt.SetTextShiftH(2);
//--- Задаём координаты и размеры области изображения
radio_bt_rt.SetImageBound(radio_bt_rt.Width()-h+2,1,h-2,h-2);
//--- Устанавливаем идентификатор элемента, рисуем элемент
//--- и выводим в журнал его описание.
radio_bt_rt.SetID(15);
radio_bt_rt.Draw(true);
radio_bt_rt.Print();
//--- Успешная инициализация
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom deindicator initialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
list.Clear();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- Вызываем обработчик событий каждого из созданных объектов
for(int i=0;i<list.Total();i++)
{
CCanvasBase *obj=list.At(i);
if(obj!=NULL)
obj.OnChartEvent(id,lparam,dparam,sparam);
}
//--- Эмулируем работу радиокнопок в группе ---
//--- Если получено пользовательское событие
if(id>=CHARTEVENT_CUSTOM)
{
//--- Если нажата левая радиокнопка
if(sparam==radio_bt_lt.NameBG())
{
//--- Если состояние кнопки изменено (было не выбрано)
if(radio_bt_lt.State())
{
//--- делаем правую радиокнопку невыбранной и перерисовываем её
radio_bt_rt.SetState(false);
radio_bt_rt.Draw(true);
}
}
//--- Если нажата правая радиокнопка
if(sparam==radio_bt_rt.NameBG())
{
//--- Если состояние кнопки изменено (было не выбрано)
if(radio_bt_rt.State())
{
//--- делаем левую радиокнопку невыбранной и перерисовываем её
radio_bt_lt.SetState(false);
radio_bt_lt.Draw(true);
}
}
}
}
//+------------------------------------------------------------------+