Диалоговое окно сообщений

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
MB_ICONERROR
MB_ICONHAND

0x0010

знак "STOP"

icon error

MB_ICONQUESTION

0x0020

вопросительный знак

icon question

MB_ICONEXCLAMATION
MB_ICONWARNING

0x0030

восклицательный знак

icon warning

MB_ICONINFORMATION
MB_ICONASTERISK

0x0040

знак информации

icon information

Все значки зависят от версии операционной системы. Приведенные образцы могут отличаться на вашем компьютере.

Для выбора активной кнопки зарезервированы следующие значения.

Константа

Значение

Описание

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?"NULLMB_YESNOCANCEL);
   // используем switch или if по необходимости
   switch(result)
   {
   case IDYES:
     // ...
     break;
   case IDNO:
     // ...
     break;
   case IDCANCEL:
     // ...
     break;
   }

Для тестирования функции MessageBox написан скрипт OutputMessage.mq5, в котором пользователь может с помощью входных переменных выбрать параметры диалога и увидеть его в действии.

Группы настроек кнопок, значков и выделенной по умолчанию кнопки, а также коды возврата описаны в специальных перечислениях: ENUM_MB_BUTTONS, ENUM_MB_ICONS, ENUM_MB_DEFAULT, ENUM_MB_RESULT. Это обеспечивает наглядный ввод данных через выпадающие списки и упрощение их конвертации в строки с помощью EnumToString.

Вот, например, как определены два первых перечисления.

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)
};

С остальными можно ознакомиться в исходном коде.

Они затем используются в качестве типов входных переменных (причем комментарии элементов обеспечивают более дружественное представление в пользовательском интерфейсе).

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(textStringLen(Caption) ? Caption : NULLButtons | Icon | Default);
   Print(EnumToString(result));
}

Скрипт показывает в окне указанное сообщение, а также заданные настройки диалога. Результат диалога выводится в журнал.

Копия экрана при выборе параметров и получившийся диалог показаны на следующих изображениях.

Диалог настройки свойств окна

Диалог настройки свойств окна

Полученное диалоговое окно с сообщением

Полученное диалоговое окно с сообщением