//+------------------------------------------------------------------+
//| ButtonClickExpert.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- создадим кнопку, для передачи пользовательских событий
ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
ObjectSetInteger(0,buttonID,OBJPROP_COLOR,clrWhite);
ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,clrGray);
ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
//--- создадим метку для вывода информации
ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
ObjectSetInteger(0,labelID,OBJPROP_COLOR,clrRed);
ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,buttonID);
ObjectDelete(0,labelID);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- проверим событие на нажатие кнопки мышки
if(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
//--- если нажатие на объекте с именем buttonID
if(clickedChartObject==buttonID)
{
//--- состояние кнопки - нажата кнопка или нет
bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
//--- выведем в лог отладочное сообщение
Print("Кнопка нажата = ",selected);
int customEventID; // номер пользовательского события для отправки
string message; // сообщение для отправки в событии
//--- если кнопка нажата
if(selected)
{
message="Кнопка нажата";
customEventID=CHARTEVENT_CUSTOM+1;
}
else // кнопка не нажата
{
message="Кнопка отжата";
customEventID=CHARTEVENT_CUSTOM+999;
}
//--- отправим пользовательское событие "своему"графику
EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
//--- отправим сообщение всем открытым графикам
BroadcastEvent(ChartID(),0,"Broadcast Message");
//--- отладочное сообщение
Print("Отправлено событие с ID = ",customEventID);
}
ChartRedraw();// принудительно перерисуем все объекты на графике
}
//--- проверим событие на принадлежность к пользовательским событиям
if(id>CHARTEVENT_CUSTOM)
{
if(id==broadcastEventID)
{
Print("Получили широковещательное сообщение от графика с id = "+lparam);
}
else
{
//--- прочитаем текстовое сообщение в событии
string info=sparam;
Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID = ",id);
//--- выведем сообщение в метке
ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
ChartRedraw();// принудительно перерисуем все объекты на графике
}
}
}
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытым графикам |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
{
int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
long currChart=ChartFirst();
int i=0;
while(i<CHARTS_MAX) // у нас наверняка не больше CHARTS_MAX открытых графиков
{
EventChartCustom(currChart,eventID,lparam,dparam,sparam);
currChart=ChartNext(currChart); // на основании предыдущего получим новый график
if(currChart==-1) break; // достигли конца списка графиков
i++; // не забудем увеличить счетчик
}
}
//+------------------------------------------------------------------+ |