Hộp thoại thông báo
API MQL5 cung cấp hàm MessageBox
để tương tác với người dùng, yêu cầu xác nhận hành động hoặc chọn một tùy chọn để xử lý một tình huống cụ thể.
int MessageBox(const string message, const string caption = NULL, int flags = 0)
Hàm này mở một hộp thoại không chế độ (modeless) với thông điệp được cung cấp (message
), tiêu đề (caption
), và các cài đặt (flags
). Cửa sổ vẫn hiển thị trên cùng của cửa sổ terminal chính cho đến khi người dùng đóng nó bằng cách nhấp vào một trong các nút có sẵn (xem thêm ở phần sau).
Thông điệp cũng được hiển thị trong nhật ký chuyên gia với nhãn "Message".
Nếu tham số caption
là NULL
, tên của chương trình MQL sẽ được sử dụng làm tiêu đề.
Tham số flags
phải chứa một tổ hợp các cờ bit được kết hợp bằng phép toán OR (|
). Bộ cờ được hỗ trợ tổng quát được chia thành 3 nhóm xác định:
- Bộ nút trong hộp thoại
- Hình ảnh biểu tượng trong hộp thoại
- Lựa chọn nút hoạt động mặc định
Bảng sau liệt kê các hằng số và giá trị cờ để xác định các nút hộp thoại.
Hằng số | Giá trị | Mô tả |
---|---|---|
MB_OK | 0x0000 | 1 nút OK (mặc định) |
MB_OKCANCEL | 0x0001 | 2 nút: OK và Cancel |
MB_ABORTRETRYIGNORE | 0x0002 | 3 nút: Abort, Retry, Ignore |
MB_YESNOCANCEL | 0x0003 | 3 nút: Yes, No, Cancel |
MB_YESNO | 0x0004 | 2 nút: Yes và No |
MB_RETRYCANCEL | 0x0005 | 2 nút: Retry và Cancel |
MB_CANCELTRYCONTINUE | 0x0006 | 3 nút: Cancel, Try Again, Continue |
Bảng sau liệt kê các hình ảnh có sẵn (hiển thị bên trái của thông điệp).
Hằng số | Giá trị | Mô tả |
---|---|---|
MB_ICONSTOP MB_ICONERROR MB_ICONHAND | 0x0010 | Biểu tượng STOP![]() |
MB_ICONQUESTION | 0x0020 | Dấu hỏi![]() |
MB_ICONEXCLAMATION MB_ICONWARNING | 0x0030 | Dấu chấm than![]() |
MB_ICONINFORMATION MB_ICONASTERISK | 0x0040 | Biểu tượng thông tin![]() |
Tất cả các biểu tượng phụ thuộc vào phiên bản hệ điều hành. Các ví dụ được hiển thị có thể khác trên máy tính của bạn.
Các giá trị sau được dành sẵn để chọn nút hoạt động mặc định.
Hằng số | Giá trị | Mô tả |
---|---|---|
MB_DEFBUTTON1 | 0x0000 | Nút đầu tiên (mặc định) nếu không chọn hằng số nào khác |
MB_DEFBUTTON2 | 0x0100 | Nút thứ hai |
MB_DEFBUTTON3 | 0x0200 | Nút thứ ba |
MB_DEFBUTTON4 | 0x0300 | Nút thứ tư |
Câu hỏi có thể nảy sinh về nút thứ tư là gì nếu các hằng số trên chỉ cho phép đặt tối đa ba nút. Thực tế là trong số các cờ còn có
MB_HELP
(0x00004000
). Nó yêu cầu hiển thị nút Help trong hộp thoại. Sau đó, nó có thể trở thành nút thứ tư nếu có ba nút chính. Tuy nhiên, việc nhấp vào nút Help không đóng hộp thoại, không giống như các nút khác. Theo tiêu chuẩn Windows, một tệp trợ giúp có thể được liên kết với chương trình, tệp này sẽ mở ra với trợ giúp cần thiết khi nhấn nút Help. Tuy nhiên, các chương trình MQL hiện tại không hỗ trợ công nghệ này.
Hàm trả về một trong những giá trị được xác định trước tùy thuộc vào cách hộp thoại được đóng (nút nào được nhấn).
Hằng số | Giá trị | Mô tả |
---|---|---|
IDOK | 1 | Nút OK |
IDCANCEL | 2 | Nút Cancel |
IDABORT | 3 | Nút Abort |
IDRETRY | 4 | Nút Retry |
IDIGNORE | 5 | Nút Ignore |
IDYES | 6 | Nút Yes |
IDNO | 7 | Nút No |
IDTRYAGAIN | 10 | Nút Try Again |
IDCONTINUE | 11 | Nút Continue |
Nếu hộp thoại có nút Cancel, hàm trả về IDCANCEL
khi nhấn phím ESC (ngoài việc nhấn nút Cancel). Nếu hộp thoại không có nút Cancel, việc nhấn ESC không có tác dụng.
Việc gọi MessageBox
tạm dừng thực thi chương trình MQL hiện tại cho đến khi người dùng đóng hộp thoại. Vì lý do này, việc sử dụng MessageBox
bị cấm trong các chỉ báo, vì các chỉ báo được thực thi trong luồng giao diện của terminal, và việc chờ phản hồi của người dùng sẽ làm chậm việc cập nhật biểu đồ.
Ngoài ra, hàm không thể được sử dụng trong các dịch vụ, vì chúng không có kết nối với giao diện người dùng, trong khi các loại chương trình MQL khác được thực thi trong bối cảnh của biểu đồ.
Khi làm việc trong trình kiểm tra chiến lược, hàm MessageBox
không có hiệu lực và trả về 0
.
Sau khi nhận được kết quả từ lời gọi hàm, bạn có thể xử lý nó theo cách bạn muốn, ví dụ:
int result = MessageBox("Continue?", NULL, MB_YESNOCANCEL);
// sử dụng 'switch' hoặc 'if' tùy theo nhu cầu
switch(result)
{
case IDYES:
// ...
break;
case IDNO:
// ...
break;
case IDCANCEL:
// ...
break;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Hàm MessageBox
có thể được kiểm tra bằng tập lệnh OutputMessage.mq5
, trong đó người dùng có thể chọn các tham số của hộp thoại bằng các biến đầu vào và xem nó hoạt động.
Các nhóm cài đặt cho nút, biểu tượng, và nút mặc định được chọn, cũng như mã trả về, được mô tả trong các liệt kê đặc biệt: ENUM_MB_BUTTONS
, ENUM_MB_ICONS
, ENUM_MB_DEFAULT
, ENUM_MB_RESULT
. Điều này cung cấp đầu vào trực quan qua danh sách thả xuống và đơn giản hóa việc chuyển đổi chúng thành chuỗi bằng EnumToString
.
Ví dụ, đây là cách hai liệt kê đầu tiên được định nghĩa.
enum ENUM_MB_BUTTONS
{
_OK = MB_OK, // Ok
_OK_CANCEL = MB_OKCANCEL, // Ok | Cancel
_ABORT_RETRY_IGNORE = MB_ABORTRETRYIGNORE, // Abort | Retry | Ignore
_YES_NO_CANCEL = MB_YESNOCANCEL, // Yes | No | Cancel
_YES_NO = MB_YESNO, // Yes | No
_RETRY_CANCEL = MB_RETRYCANCEL, // Retry | Cancel
_CANCEL_TRYAGAIN_CONTINUE = MB_CANCELTRYCONTINUE, // Cancel | Try Again | Continue
};
enum ENUM_MB_ICONS
{
_ICON_NONE = 0, // None
_ICON_QUESTION = MB_ICONQUESTION, // Question
_ICON_INFORMATION_ASTERISK = MB_ICONINFORMATION, // Information (Asterisk)
_ICON_WARNING_EXCLAMATION = MB_ICONWARNING, // Warning (Exclamation)
_ICON_ERROR_STOP_HAND = MB_ICONERROR, // Error (Stop, Hand)
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Phần còn lại có thể được tìm thấy trong mã nguồn.
Chúng sau đó được sử dụng làm kiểu biến đầu vào (với các chú thích phần tử cung cấp giao diện thân thiện hơn trong giao diện người dùng).
input string Message = "Message";
input string Caption = "";
input ENUM_MB_BUTTONS Buttons = _OK;
input ENUM_MB_ICONS Icon = _ICON_NONE;
input ENUM_MB_DEFAULT Default = _DEF_BUTTON1;
void OnStart()
{
const string text = Message + "\n"
+ EnumToString(Buttons) + ", "
+ EnumToString(Icon) + ","
+ EnumToString(Default);
ENUM_MB_RESULT result = (ENUM_MB_RESULT)
MessageBox(text, StringLen(Caption) ? Caption : NULL, Buttons | Icon | Default);
Print(EnumToString(result));
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Tập lệnh hiển thị thông điệp được chỉ định trong cửa sổ, cùng với các cài đặt hộp thoại được chỉ định. Kết quả của hộp thoại được hiển thị trong nhật ký.
Ảnh chụp màn hình của việc chọn tùy chọn và hộp thoại kết quả được hiển thị trong các hình ảnh sau.
Hộp thoại thuộc tính cửa sổ
Hộp thoại thông điệp nhận được