Cuadro de diálogo de mensajes

La API de MQL5 proporciona la función MessageBox para pedir interactivamente al usuario que confirme acciones o seleccione una opción para manejar una situación particular.

int MessageBox(const string message, const string caption = NULL, int flags = 0)

La función abre un cuadro de diálogo sin modelo con el mensaje (message), el encabezado (caption) y la configuración (flags) dados. La ventana permanece visible encima de la ventana principal del terminal hasta que el usuario la cierra pulsando uno de los botones disponibles (véase más adelante).

El mensaje también se muestra en el registro de expertos con la marca «Mensaje».

Si el parámetro caption es NULL, se utiliza el nombre del programa MQL como título.

El parámetro flags debe contener una combinación de banderas de bits combinadas con una operación OR ('|'). El conjunto general de banderas admitidas se divide en 3 grupos que definen:

  • un conjunto de botones en el cuadro de diálogo
  • imagen del icono en el cuadro de diálogo
  • selección del botón activo por defecto

En la siguiente tabla se enumeran las constantes y los valores de las banderas para definir los botones del cuadro de diálogo.

Constante

Valor

Descripción

MB_OK

0x0000

1 botón OK (por defecto)

MB_OKCANCEL

0x0001

2 botones: OK y Cancelar

MB_ABORTRETRYIGNORE

0x0002

3 botones: Abortar, Reintentar, Ignorar

MB_YESNOCANCEL

0x0003

3 botones: Sí, No, Cancelar

MB_YESNO

0x0004

2 botones: Sí y No

MB_RETRYCANCEL

0x0005

2 botones: Reintentar y Cancelar

MB_CANCELTRYCONTINUE

0x0006

3 botones: Cancelar, Intentar de nuevo, Continuar

En la siguiente tabla se enumeran las imágenes disponibles (que aparecen a la izquierda del mensaje).

Constante

Valor

Descripción

MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND

0x0010

Señal de STOP

icono de error

MB_ICONQUESTION

0x0020

Signo de interrogación

icono de pregunta

MB_ICONEXCLAMATION
MB_ICONWARNING

0x0030

Signo de exclamación

icono de advertencia

MB_ICONINFORMATION
MB_ICONASTERISK

0x0040

Señal de información

icono de información

Todos los iconos dependen de la versión del sistema operativo. Los ejemplos mostrados pueden diferir en su ordenador.

Los siguientes valores están reservados para seleccionar el botón activo.

Constante

Valor

Descripción

MB_DEFBUTTON1

0x0000

El primer botón (por defecto) si no se selecciona ninguna de las otras constantes.

MB_DEFBUTTON2

0x0100

El segundo botón

MB_DEFBUTTON3

0x0200

El tercer botón

MB_DEFBUTTON4

0x0300

El cuarto botón

Puede surgir la pregunta de cuál es este cuarto botón si las constantes anteriores no permiten establecer más de tres. El hecho es que entre las banderas también hay MB_HELP (0x00004000), que ordena mostrar el botón Ayuda en el cuadro de diálogo. Entonces puede convertirse en el cuarto consecutivo si hay tres botones principales. No obstante, al hacer clic en el botón Ayuda no se cierra el cuadro de diálogo, a diferencia de otros botones. Según el estándar de Windows, se puede asociar un archivo de ayuda al programa, que debe abrirse con la ayuda necesaria al pulsar el botón Ayuda. Sin embargo, los programas MQL no admiten actualmente esta tecnología.

La función devuelve uno de los valores predefinidos dependiendo de cómo se cerró el cuadro de diálogo (qué botón se pulsó).

Constante

Valor

Descripción

IDOK

1

Botón OK

IDCANCEL

2

Botón Cancelar

IDABORT

3

Botón Abortar

IDRETRY

4

Botón Reintentar

IDIGNORE

5

Botón Ignorar

IDYES

6

Botón Sí

IDNO

7

Botón No

IDTRYAGAIN

10

Botón Intentar de nuevo

IDCONTINUE

11

Botón Continuar

Si el buzón de mensajes tiene un botón Cancelar, la función devuelve IDCANCEL cuando se pulsa la tecla ESC (además del botón Cancelar). Si el cuadro de mensaje no tiene botón Cancelar, pulsar ESC no tiene ningún efecto.

Llamar a MessageBox suspende la ejecución del programa MQL actual hasta que el usuario cierre el cuadro de diálogo. Por esta razón, el uso de MessageBox está prohibido en indicadores, ya que los indicadores se ejecutan en el hilo de la interfaz del terminal, y esperar la respuesta del usuario ralentizaría la actualización de los gráficos.

Además, la función no puede utilizarse en servicios, ya que no tienen conexión con la interfaz de usuario, mientras que otros tipos de programas MQL se ejecutan en el contexto del gráfico.

Cuando se trabaja en el probador de estrategias, la función MessageBox no tiene ningún efecto y devuelve 0.

Después de obtener el resultado de la llamada a la función, puede procesarlo de la forma que desee, por ejemplo:

   int result = MessageBox("Continue?"NULLMB_YESNOCANCEL);
 // use 'switch' or 'if' as needed
   switch(result)
   {
   case IDYES:
     // ...
     break;
   case IDNO:
     // ...
     break;
   case IDCANCEL:
     // ...
     break;
   }

La función MessageBox puede probarse utilizando el script OutputMessage.mq5, en el que el usuario puede seleccionar los parámetros del cuadro de diálogo utilizando variables de entrada y verlo en acción.

Los grupos de ajustes para botones, iconos y el botón seleccionado por defecto, así como los códigos de retorno, se describen en enumeraciones especiales: ENUM_MB_BUTTONS, ENUM_MB_ICONS, ENUM_MB_DEFAULT, ENUM_MB_RESULT. Esto proporciona una entrada visual a través de listas desplegables y simplifica su conversión a cadenas mediante EnumToString.

Por ejemplo, así se definen las dos primeras enumeraciones:

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

El resto se puede encontrar en el código fuente.

A continuación se utilizan como tipos de variables de entrada (con comentarios de elementos que proporcionan una presentación más fácil de usar en la interfaz de usuario).

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

El script muestra el mensaje especificado en la ventana, junto con la configuración del cuadro de diálogo especificada. El resultado del cuadro de diálogo se muestra en el registro.

En las siguientes imágenes se muestra una captura de pantalla de la selección de opciones y el cuadro de diálogo resultante.

Cuadro de diálogo de propiedades de la ventana

Cuadro de diálogo de propiedades de la ventana

Cuadro de diálogo de mensaje recibido

Cuadro de diálogo de mensaje recibido