鼠标事件
我们已经在 事件相关图表特性章节中使用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参数包含一个字符串形式的位掩码,用于描述鼠标按键和控制键(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 |
X 坐标的 short类型值 |
1 |
|
2 |
Y 坐标的 short类型值 |
3 |
|
4 |
按钮和按键状态的位掩码 |
5 |
未使用 |
6 |
|
7 |
无论事件类型如何,鼠标坐标都是相对于整个窗口(包括子窗口)传输的,因此如有必要,应针对特定子窗口重新计算坐标。
为了更好地理解 CHARTEVENT_MOUSE_WHEEL,可使用指标EventMouseWheel.mq5。该指标会接收并解码消息,然后将消息描述输出到日志中。
#define KEY_FLAG_NUMBER 7
|
在图表上运行该指标,然后依次按住不同的鼠标按键和按键并滚动鼠标滚轮。以下是示例结果:
X=186 Y=303 D=-120
|