Типы событий графика

Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom().

ENUM_CHART_EVENT

Идентификатор

Описание

CHARTEVENT_KEYDOWN

Нажатие клавиатуры

CHARTEVENT_MOUSE_MOVE

Перемещение мыши и нажатие кнопок мышки (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_WHEEL

Нажатие или прокрутка колесика мышки (если для графика установлено свойство CHART_EVENT_MOUSE_WHEEL=true)

CHARTEVENT_OBJECT_CREATE

Создание графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true)

CHARTEVENT_OBJECT_CHANGE

Изменение свойств графического объекта через диалог свойств

CHARTEVENT_OBJECT_DELETE

Удаление графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true)

CHARTEVENT_CLICK

Нажатие мышки на графике

CHARTEVENT_OBJECT_CLICK

Нажатие мышки на графическом объекте

CHARTEVENT_OBJECT_DRAG

Перетаскивание графического объекта

CHARTEVENT_OBJECT_ENDEDIT

Окончание редактирования текста в графическом объекте Edit

CHARTEVENT_CHART_CHANGE

Изменение размеров графика или изменение свойств графика через диалог свойств

CHARTEVENT_CUSTOM

Начальный номер события из диапазона пользовательских событий

CHARTEVENT_CUSTOM_LAST

Конечный номер события из диапазона пользовательских событий

Для каждого типа события входные параметры функции OnChartEvent() имеют определенные значения, которые необходимы для обработки этого события. В таблице перечислены события и значения, которые передаются через параметры.

Событие

Значение параметра id

Значение параметра lparam

Значение параметра dparam

Значение параметра  sparam

Событие нажатия клавиатуры

CHARTEVENT_KEYDOWN

код нажатой клавиши

Количество нажатий клавиши,сгенерированных за время её удержания в нажатом состоянии

Строковое значение битовой маски, описывающее статус кнопок клавиатуры

События мышки (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true)

CHARTEVENT_MOUSE_MOVE

X координата

Y координата

Строковое значение битовой маски, описывающее статус кнопок мыши

Событие колёсика мышки (если для графика установлено свойство CHART_EVENT_MOUSE_WHEEL=true)

CHARTEVENT_MOUSE_WHEEL

Флаги состояний клавиш и кнопок мышки, координаты X и Y курсора. Описание дано в примере ниже

Значение Delta прокрутки колёсика мышки

Событие создания графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true)

CHARTEVENT_OBJECT_CREATE

Имя созданного графического объекта

Событие изменения свойств объекта через диалог свойств

CHARTEVENT_OBJECT_CHANGE

Имя измененного графического объекта

Событие удаления графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true)

CHARTEVENT_OBJECT_DELETE

Имя удаленного графического объекта

Событие щелчка мышки на графике

CHARTEVENT_CLICK

X координата

Y координата

Событие щелчка мышки на графическом объекте

CHARTEVENT_OBJECT_CLICK

X координата

Y координата

Имя графического объекта, на котором произошло событие

Событие перемещения графического объекта при помощи мышки

CHARTEVENT_OBJECT_DRAG

Имя перемещенного графического объекта

Событие окончания редактирования текста в поле ввода графического объекта "Поле ввода"

CHARTEVENT_OBJECT_ENDEDIT

Имя графического объекта "Поле ввода", в котором завершилось редактирование текста

Событие изменения размеров графика или изменения свойств графика через диалог свойств

CHARTEVENT_CHART_CHANGE

Пользовательское событие с номером N

CHARTEVENT_CUSTOM+N

Значение, заданное функцией EventChartCustom()

Значение, заданное функцией EventChartCustom()

Значение, заданное функцией EventChartCustom()

Пример:

#define KEY_NUMPAD_5       12
#define KEY_LEFT           37
#define KEY_UP             38
#define KEY_RIGHT          39
#define KEY_DOWN           40
#define KEY_NUMLOCK_DOWN   98
#define KEY_NUMLOCK_LEFT  100
#define KEY_NUMLOCK_5     101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP    104
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Запущен эксперт с именем ",MQL5InfoString(MQL5_PROGRAM_NAME));
//--- установка флага получения событий создания объектов графика
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- установка флага получения событий удаления объектов графика
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
  {
//--- нажатие левой кнопкой мышки на графике
   if(id==CHARTEVENT_CLICK)
      Print("Координаты щелчка мышки на графике: x = ",lparam,"  y = ",dparam);
//--- нажатие мышкой на графическом объекте
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'");
//--- нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch(lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Нажата KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Нажата KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Нажата KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Нажата KEY_UP");             break;
         case KEY_NUMLOCK_RIGHT: Print("Нажата KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Нажата KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Нажата KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Нажата KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Нажата KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Нажата KEY_NUMLOCK_5");      break;
         default:                Print("Нажата какая-то неперечисленная клавиша");
        }
      ChartRedraw();
     }
//--- удален объекта
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Удален объект с именем ",sparam);
//--- создан объект
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Создан объект с именем ",sparam);
//--- перемещен объект или изменены координаты точек привязки
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Изменение точек привязки объекта с именем ",sparam);
//--- изменен текст в поле ввода графического объекта Edit
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Изменен текст в объекте Edit ",sparam);
  }

Для события CHARTEVENT_MOUSE_MOVE строковой параметр sparam содержит число, представляющее информацию о состоянии клавиш:

Бит

Описание

1

Состояние левой клавиши мыши

2

Состояние правой клавиши мыши

3

Состояние клавиши SHIFT

4

Состояние клавиши CTRL

5

Состояние средней клавиши мыши

6

Состояние первой дополнительной клавиши мыши

7

Состояние второй дополнительной клавиши мыши

Пример:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- включение сообщений о перемещении мыши по окну чарта
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- отключаем контекстное меню чарта (по правой кнопке)   
   ChartSetInteger(0,CHART_CONTEXT_MENU,0);     
//--- отключаем перекрестие (по средней кнопке)      
   ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| MouseState                                                       |
//+------------------------------------------------------------------+
string MouseState(uint state)
  {
   string res;
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right 
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key
   return(res);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
  }

 

//--- отключаем контекстное меню чарта (по правой кнопке)   
   ChartSetInteger(0,CHART_CONTEXT_MENU,0);     
//--- отключаем перекрестие (по средней снопке)      
   ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0); 

 

Для события CHARTEVENT_MOUSE_WHEEL параметры lparam и dparam содержат информацию о состоянии клавиш Ctrl, Shift, кнопок мышки, координатах курсора и величине прокрутки колёсика мышки. Для лучшего понимания запустите этот советник на графике и прокручивайте колёсико мышки, нажимая поочередно различные кнопки и клавиши, описанные в коде.

Пример обработки события CHARTEVENT_MOUSE_WHEEL:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
init OnInit()
  {
//--- включение сообщений о прокрутке колесика мышки
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- разберем состояние кнопок и колесика мышки для этого события 
      int flg_keys = (int)(lparam>>32);          // флаг состояний клавиш Ctrl, Shift и кнопок мышки
      int x_cursor = (int)(short)lparam;         // X-координата, в которой произошло событие колесика мышки
      int y_cursor = (int)(short)(lparam>>16);   // Y-координата, в которой произошло событие колесика мышки
      int delta    = (int)dparam;                // суммарное значение прокрутки колесика, срабатывает при достижении +120 или -120
      //--- обработаем флаг 
      string str_keys="";
      if((flg_keys&0x0001)!=0) 
         str_keys+="LMOUSE ";
      if((flg_keys&0x0002)!=0) 
         str_keys+="RMOUSE ";
      if((flg_keys&0x0004)!=0) 
         str_keys+="SHIFT ";
      if((flg_keys&0x0008)!=0) 
         str_keys+="CTRL ";
      if((flg_keys&0x0010)!=0) 
         str_keys+="MMOUSE ";
      if((flg_keys&0x0020)!=0) 
         str_keys+="X1MOUSE ";
      if((flg_keys&0x0040)!=0) 
         str_keys+="X2MOUSE ";
      
      if(str_keys!="")
         str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1) + "'";
      PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys);
     }
  }
//+------------------------------------------------------------------+ /*
   Пример вывода
   CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
   CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
   CHARTEVENT_MOUSE_WHEEL:  X=178, Y=447, delta=-120
   CHARTEVENT_MOUSE_WHEEL:  X=231, Y=449, delta=120
   CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
   CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
   CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120  */

Смотри также

Функции обработки событий, Работа с событиями