401 Zeilen
20 KiB
MQL5
401 Zeilen
20 KiB
MQL5
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| 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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//+------------------------------------------------------------------+
|