Quản lý trạng thái nhấn của đối tượng
Đối với các đối tượng như nút bấm (OBJ_BUTTON
) và bảng có hình ảnh (OBJ_BITMAP_LABEL
), terminal hỗ trợ một thuộc tính đặc biệt giúp chuyển đổi trực quan đối tượng từ trạng thái bình thường (thả) sang trạng thái nhấn và ngược lại. Hằng số OBJPROP_STATE
được dành sẵn cho việc này. Thuộc tính này thuộc kiểu Boolean: khi giá trị là true
, đối tượng được coi là đang nhấn, và khi là false
, nó được coi là đang thả (mặc định).
Đối với OBJ_BUTTON
, hiệu ứng khung ba chiều được terminal tự vẽ, trong khi với OBJ_BITMAP_LABEL
, lập trình viên phải chỉ định hai hình ảnh (dưới dạng tệp hoặc tài nguyên) để cung cấp biểu diễn bên ngoài phù hợp. Vì thuộc tính này về mặt kỹ thuật chỉ là một công tắc, nên dễ dàng sử dụng nó cho các mục đích khác, không chỉ cho hiệu ứng "nhấn" và "thả". Ví dụ, với sự trợ giúp của các hình ảnh phù hợp, bạn có thể triển khai một cờ (tùy chọn).
Việc sử dụng hình ảnh trong các đối tượng sẽ được thảo luận trong phần tiếp theo.
Trạng thái của đối tượng thường thay đổi trong các chương trình MQL tương tác phản hồi hành động của người dùng, đặc biệt là các lần nhấp chuột. Chúng ta sẽ thảo luận về khả năng này trong chương về sự kiện.
Bây giờ, hãy kiểm tra thuộc tính này trên các nút đơn giản, ở chế độ tĩnh. Script ObjectButtons.mq5
tạo ra hai nút trên biểu đồ: một ở trạng thái nhấn, và cái còn lại ở trạng thái thả.
Việc cài đặt một nút duy nhất được giao cho hàm SetupButton
với các tham số chỉ định tên và văn bản của nút, cũng như tọa độ, kích thước và trạng thái của nó.
#include "ObjectPrefix.mqh"
void SetupButton(const string button,
const int x, const int y,
const int dx, const int dy,
const bool state = false)
{
const string name = ObjNamePrefix + button;
ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
// vị trí và kích thước
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, name, OBJPROP_XSIZE, dx);
ObjectSetInteger(0, name, OBJPROP_YSIZE, dy);
// nhãn trên nút
ObjectSetString(0, name, OBJPROP_TEXT, button);
// nhấn (true) / thả (false)
ObjectSetInteger(0, name, OBJPROP_STATE, state);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sau đó, trong OnStart
, chúng ta gọi hàm này hai lần.
void OnStart()
{
SetupButton("Pressed", 100, 100, 100, 20, true);
SetupButton("Normal", 100, 150, 100, 20);
}
2
3
4
5
Các nút kết quả có thể trông như thế này.
Nút OBJ_BUTTON
ở trạng thái nhấn và thả
Điều thú vị là bạn có thể nhấp vào bất kỳ nút nào bằng chuột, và nút sẽ thay đổi trạng thái của nó. Tuy nhiên, chúng ta chưa thảo luận về cách bắt thông báo về việc này.
Điều quan trọng cần lưu ý là việc chuyển đổi trạng thái tự động này chỉ được thực hiện nếu tùy chọn Disable selection
được chọn trong thuộc tính đối tượng, nhưng điều kiện này là mặc định cho tất cả các đối tượng được tạo bằng lập trình. Hãy nhớ rằng, nếu cần, việc chọn này có thể được bật: để làm điều này, bạn phải đặt rõ ràng thuộc tính OBJPROP_SELECTABLE
thành true
. Chúng ta đã sử dụng nó trong một số ví dụ trước.
Để xóa các nút không còn cần thiết, hãy sử dụng script ObjectCleanup1.mq5
.