Диалоговое окно сообщений
MQL5 API включает функцию MessageBox для интерактивного запроса пользователя о подтверждении действий или выбора варианта обработки конкретной ситуации.
int MessageBox(const string message, const string caption = NULL, int flags = 0)
Функция открывает немодальное диалоговое окно с заданным сообщением (message), заголовком (caption) и настройками (flags). Окно остается видимым поверх главного окна терминала, пока пользователь не закроет его, нажатием на одну из доступных кнопок (см. далее).
Сообщение также выводится в журнал экспертов с пометкой "Message".
Если параметр caption равен NULL, в качестве заголовка используется название MQL-программы.
Параметр flags должен содержать комбинацию битовых флагов, объединенных операцией ИЛИ ('|'). Общий набор поддерживаемых флагов делится на 3 группы, определяющих:
- набор кнопок в диалоге;
- изображение значка в диалоге;
- выбор активной кнопки по умолчанию;
В следующей таблице приведены константы и значения флагов для определения кнопок диалога.
Константа |
Значение |
Описание |
---|---|---|
MB_OK |
0x0000 |
1 кнопка OK (по умолчанию) |
MB_OKCANCEL |
0x0001 |
2 кнопки: OK и Отмена (Cancel) |
MB_ABORTRETRYIGNORE |
0x0002 |
3 кнопки: Прервать (Abort), Повтор (Retry), Пропустить (Ignore) |
MB_YESNOCANCEL |
0x0003 |
3 кнопки: Да (Yes), Нет (No), Отмена (Cancel) |
MB_YESNO |
0x0004 |
2 кнопки: Да (Yes) и Нет (No) |
MB_RETRYCANCEL |
0x0005 |
2 кнопки: Повтор (Retry) и Отмена (Cancel) |
MB_CANCELTRYCONTINUE |
0x0006 |
3 кнопки: Отмена (Cancel), Повторить (Try Again), Продолжить (Continue) |
В следующей таблице перечислены доступные изображения (выводятся слева от сообщения).
Константа |
Значение |
Описание |
||
---|---|---|---|---|
MB_ICONSTOP |
0x0010 |
|
||
MB_ICONQUESTION |
0x0020 |
|
||
MB_ICONEXCLAMATION |
0x0030 |
|
||
MB_ICONINFORMATION |
0x0040 |
|
Все значки зависят от версии операционной системы. Приведенные образцы могут отличаться на вашем компьютере.
Для выбора активной кнопки зарезервированы следующие значения.
Константа |
Значение |
Описание |
---|---|---|
MB_DEFBUTTON1 |
0x0000 |
первая кнопка (по умолчанию), если не выбрана ни одна из других констант |
MB_DEFBUTTON2 |
0x0100 |
вторая кнопка |
MB_DEFBUTTON3 |
0x0200 |
третья кнопка |
MB_DEFBUTTON4 |
0x0300 |
четвертая кнопка |
Может возникнуть вопрос, что это за 4-я кнопка, если вышеприведенные константы позволяют задать не более трех. Дело в том, что среди флагов имеется также MB_HELP (0x00004000). Он предписывает показать в диалоге кнопку Справка. Она то и может стать по счету четвертой, если основных кнопок три. Однако нажатие на кнопку Справка не приводит к закрытию диалога, в отличие от остальных кнопок. По стандарту Windows с программой может быть связан файл справки, который должен открываться с необходимой подсказкой по нажатию кнопки Справка. Однако в настоящий момент MQL-программы пока не поддерживают эту технологию.
Функция возвращает одно из предопределенных значений в зависимости от того, каким способом был закрыт диалог (какая кнопка нажата).
Константа |
Значение |
Описание |
---|---|---|
IDOK |
1 |
кнопка OK |
IDCANCEL |
2 |
кнопка Отмена (Cancel) |
IDABORT |
3 |
кнопка Прервать (Abort) |
IDRETRY |
4 |
кнопка Повтор (Retry) |
IDIGNORE |
5 |
кнопка Пропустить (Ignore) |
IDYES |
6 |
кнопка Да (Yes) |
IDNO |
7 |
кнопка Нет (No) |
IDTRYAGAIN |
10 |
кнопка Повторить (Try Again) |
IDCONTINUE |
11 |
кнопка Продолжить (Continue) |
Если окно сообщения имеет кнопку Отмена (Cancel), то функция возвращает значение IDCANCEL при нажатии клавиши ESC (помимо кнопки Отмена). Если окно сообщения не имеет кнопки Отмена (Cancel), нажатие ESC не дает никакого эффекта.
Вызов MessageBox приостанавливает выполнение текущей MQL-программы до тех пор, пока пользователь не закроет диалог. В связи с этим использование MessageBox запрещено в индикаторах, поскольку индикаторы выполняются в интерфейсном потоке терминала, и ожидание ответа пользователя затормозило бы обновление графиков.
Также функцию нельзя использовать в сервисах, потому что они не имеют связи с пользовательским интерфейсом, в то время как MQL-программы остальных типов выполняются в контексте графика.
При работе в тестере стратегий функция MessageBox не имеет эффекта и возвращает значение 0.
После получения результата из вызова функции вы можете обработать его желаемым способом, например:
int result = MessageBox("Continue?", NULL, MB_YESNOCANCEL);
|
Для тестирования функции MessageBox написан скрипт OutputMessage.mq5, в котором пользователь может с помощью входных переменных выбрать параметры диалога и увидеть его в действии.
Группы настроек кнопок, значков и выделенной по умолчанию кнопки, а также коды возврата описаны в специальных перечислениях: ENUM_MB_BUTTONS, ENUM_MB_ICONS, ENUM_MB_DEFAULT, ENUM_MB_RESULT. Это обеспечивает наглядный ввод данных через выпадающие списки и упрощение их конвертации в строки с помощью EnumToString.
Вот, например, как определены два первых перечисления.
enum ENUM_MB_BUTTONS
|
С остальными можно ознакомиться в исходном коде.
Они затем используются в качестве типов входных переменных (причем комментарии элементов обеспечивают более дружественное представление в пользовательском интерфейсе).
input string Message = "Message";
|
Скрипт показывает в окне указанное сообщение, а также заданные настройки диалога. Результат диалога выводится в журнал.
Копия экрана при выборе параметров и получившийся диалог показаны на следующих изображениях.
Диалог настройки свойств окна
Полученное диалоговое окно с сообщением