Sự kiện chuột
Chúng ta đã có cơ hội xác nhận rằng chúng ta nhận được các sự kiện chuột bằng cách sử dụng chỉ báo EventAll.mq5
từ phần Thuộc tính biểu đồ liên quan đến sự kiện. Sự kiện CHARTEVENT_CLICK
được gửi đến chương trình MQL mỗi khi nhấp chuột trong cửa sổ, và các sự kiện di chuyển con trỏ CHARTEVENT_MOUSE_MOVE
và cuộn bánh xe CHARTEVENT_MOUSE_WHEEL
yêu cầu kích hoạt trước trong cài đặt biểu đồ, mà các thuộc tính CHART_EVENT_MOUSE_MOVE
và CHART_EVENT_MOUSE_WHEEL
phục vụ tương ứng (cả hai đều bị tắt theo mặc định).
Nếu có một đối tượng đồ họa dưới con chuột, khi nút được nhấn, không chỉ sự kiện CHARTEVENT_CLICK
được tạo ra mà còn có CHARTEVENT_OBJECT_CLICK.
Đối với các sự kiện CHARTEVENT_CLICK
và CHARTEVENT_MOUSE_MOVE
, các tham số của trình xử lý OnChartEvent
chứa thông tin sau:
lparam
- Tọa độ Xdparam
- Tọa độ Y
Ngoài ra, đối với sự kiện CHARTEVENT_MOUSE_MOVE
, tham số sparam
chứa một chuỗi biểu diễn của mặt nạ bit mô tả trạng thái của các nút chuột và phím điều khiển (Ctrl
, Shift
). Việc đặt một bit cụ thể thành 1 có nghĩa là nhấn nút hoặc phím tương ứng.
Bits | Mô tả |
---|---|
0 | Trạng thái nút chuột trái |
1 | Trạng thái nút chuột phải |
2 | Trạng thái phím SHIFT |
3 | Trạng thái phím CTRL |
4 | Trạng thái nút chuột giữa |
5 | Trạng thái nút chuột bổ sung thứ nhất |
6 | Trạng thái nút chuột bổ sung thứ hai |
Ví dụ, nếu bit thứ 0 được đặt, nó sẽ cho số 1 (1 << 0), và nếu bit thứ 4 được đặt, nó sẽ cho số 16 (1 << 4). Việc nhấn đồng thời các nút hoặc phím được biểu thị bằng sự chồng lấp của các bit.
Đối với sự kiện CHARTEVENT_MOUSE_WHEEL
, tọa độ X và Y, cũng như các cờ trạng thái của nút chuột và phím điều khiển, được mã hóa đặc biệt bên trong tham số lparam
, và tham số dparam
báo cáo hướng (cộng/trừ) và lượng cuộn bánh xe (bội số của ±120).
Số nguyên 8 byte lparam
kết hợp một số trường thông tin đã đề cập.
Bytes | Mô tả |
---|---|
0 | Giá trị kiểu short với tọa độ X |
1 | |
2 | Giá trị kiểu short với tọa độ Y |
3 | |
4 | Mặt nạ bit của trạng thái nút và phím |
5 | Không sử dụng |
6 | |
7 |
Bất kể loại sự kiện nào, tọa độ chuột được truyền tương đối so với toàn bộ cửa sổ, bao gồm cả các cửa sổ phụ, vì vậy cần phải tính toán lại cho một cửa sổ phụ cụ thể nếu cần thiết.
Để hiểu rõ hơn về CHARTEVENT_MOUSE_WHEEL
, hãy sử dụng chỉ báo EventMouseWheel.mq5
. Nó nhận và giải mã các thông điệp, sau đó xuất mô tả của chúng vào nhật ký.
#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 &lparam, const double &dparam, const 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 = 0; i < KEY_FLAG_NUMBER; ++i)
{
if(((1 << i) & keymask) != 0)
{
message += keyNameByBit[i];
}
}
PrintFormat("X=%d Y=%d D=%d %s", x, y, delta, message);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Chạy chỉ báo trên biểu đồ và cuộn bánh xe chuột bằng cách nhấn lần lượt các nút và phím khác nhau. Dưới đây là một kết quả ví dụ:
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
2
3
4
5
6
7
8
9
10
11