События мыши

Мы уже имели возможность убедиться в получении событий мыши с помощью индикатора EventAll.mq5 из раздела Связанные с событиями свойства графика. Событие CHARTEVENT_CLICK передается в MQL-программу по каждому нажатию кнопки мыши в окне, а события перемещения курсора CHARTEVENT_MOUSE_MOVE и прокрутки колесика CHARTEVENT_MOUSE_WHEEL требуют предварительного включения в настройках графика, для чего служат, соответственно, свойства CHART_EVENT_MOUSE_MOVE и CHART_EVENT_MOUSE_WHEEL (оба по умолчанию отключены).

Если под мышью находится графический объект, при нажатии кнопки генерируется не только событие CHARTEVENT_CLICK, но и CHARTEVENT_OBJECT_CLICK.

Для событий CHARTEVENT_CLICK и CHARTEVENT_MOUSE_MOVE параметры обработчика OnChartEvent содержат следующую информацию:

  • lparam — координата X
  • dparam — координата Y

Кроме того, для события CHARTEVENT_MOUSE_MOVE параметр sparam содержит строковое представление битовой маски, описывающей статус кнопок мыши и управляющих клавиш (Ctrl, Shift). Установка в 1 конкретного бита означает нажатие соответствующей кнопки или клавиши.

Биты

Описание

0

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

1

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

2

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

3

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

4

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

5

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

6

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

Например, если установлен 0-й бит, получим число 1 (1 << 0), а если установлен 4-й бит, это даст число 16 (1 << 4). Одновременное нажатие кнопок или клавиш обозначается суперпозицией битов.

Для события CHARTEVENT_MOUSE_WHEEL координаты X и Y, а также флаги состояния кнопок мыши и управляющих клавиш особым образом кодируются внутри параметра lparam, а параметр dparam сообщает направление (плюс/минус) и величину прокрутки колесиком (кратную ±120).

8-байтовое целое число lparam совмещает в себе несколько упомянутых информационных полей.

Байты

Описание

0

Значение типа short с координатой X

1

2

Значение типа short с координатой Y

3

4

Битовая маска состояния кнопок и клавиш

5

Не используется

6

7

Вне зависимости от типа события координаты мыши передаются относительно всего окна, включая подокна, поэтому при необходимости их следует пересчитывать для конкретного подокна.

Для лучшего понимания CHARTEVENT_MOUSE_WHEEL воспользуйтесь индикатором EventMouseWheel.mq5. Он получает и раскодирует сообщения, выводя затем их описание в журнал.

#define KEY_FLAG_NUMBER 7
   
const string keyNameByBit[KEY_FLAG_NUMBER] =
{
   "[Left Mouse] ",
   "[Right Mouse] ",
   "(Shift) ",
   "(Ctrl) ",
   "[Middle Mouse] ",
   "[Ext1 Mouse] ",
   "[Ext2 Mouse] ",
};
   
void OnChartEvent(const int id,
   const long &lparamconst double &dparamconst string &sparam)
{
   if(id == CHARTEVENT_MOUSE_WHEEL)
   {
      const int keymask = (int)(lparam >> 32);
      const short x = (short)lparam;
      const short y = (short)(lparam >> 16);
      const short delta = (short)dparam;
      string message = "";
      
      for(int i = 0i < KEY_FLAG_NUMBER; ++i)
      {
         if(((1 << i) & keymask) != 0)
         {
            message += keyNameByBit[i];
         }
      }
      
      PrintFormat("X=%d Y=%d D=%d %s"xydeltamessage);
   }
}

Запустите индикатор на графике и прокручивайте колёсико мыши, нажимая поочередно различные кнопки и клавиши. Вот пример результата:

X=186 Y=303 D=-120 
X=186 Y=312 D=120 
X=230 Y=135 D=-120 
X=230 Y=135 D=-120 (Ctrl) 
X=230 Y=135 D=-120 (Shift) (Ctrl) 
X=230 Y=135 D=-120 (Shift) 
X=230 Y=135 D=120 
X=230 Y=135 D=-120 [Middle Mouse] 
X=230 Y=135 D=120 [Middle Mouse] 
X=236 Y=210 D=-240 
X=236 Y=210 D=-360