鼠标事件

我们已经在 事件相关图表特性章节中使用EventAll.mq5指标验证过鼠标事件的接收功能。当在窗口中点击鼠标按钮时,系统会向 MQL 程序发送 CHARTEVENT_CLICK,而 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参数包含一个字符串形式的位掩码,用于描述鼠标按键和控制键(CtrlShift)的状态。将特定位设置为 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

X 坐标的 short类型值

1

2

Y 坐标的 short类型值

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