Gestionar el estado pulsado de los objetos

Para objetos como botones (OBJ_BUTTON) y paneles con una imagen (OBJ_BITMAP_LABEL), el terminal admite una propiedad especial que cambia visualmente el objeto del estado normal (liberado) al estado pulsado y viceversa. La constante OBJPROP_STATE está reservada para ello. La propiedad es de tipo booleano: cuando el valor es true, se considera que el objeto está pulsado, y cuando es false, se considera que está liberado (por defecto).

Para OBJ_BUTTON, el efecto de un marco tridimensional es dibujado por el propio terminal, mientras que para OBJ_BITMAP_LABEL el programador debe especificar dos imágenes (como archivos o recursos) que proporcionará una representación externa adecuada. Dado que esta propiedad es técnicamente sólo un conmutador, es fácil utilizarla para otros fines, y no sólo para efectos de «pulsar» y «soltar». Por ejemplo, con la ayuda de imágenes adecuadas, puede implementar una bandera (opción).

El uso de imágenes en objetos se abordará en la siguiente sección.

El estado del objeto suele cambiar en los programas MQL interactivos que responden a las acciones del usuario, en particular a los clics del ratón. Analizaremos esta posibilidad en el capítulo sobre eventos.

Ahora vamos a probar la propiedad en botones simples, en modo estático. El script ObjectButtons.mq5 crea dos botones en el gráfico: uno en estado pulsado y otro en estado liberado.

La configuración de un solo botón se proporciona a la función SetupButton con parámetros que especifican el nombre y el texto del botón, así como sus coordenadas, tamaño y estado.

#include "ObjectPrefix.mqh"
   
void SetupButton(const string button,
   const int xconst int y,
   const int dxconst int dy,
   const bool state = false)
{
   const string name = ObjNamePrefix + button;
   ObjectCreate(0nameOBJ_BUTTON000);
   // position and size
   ObjectSetInteger(0nameOBJPROP_XDISTANCEx);
   ObjectSetInteger(0nameOBJPROP_YDISTANCEy);
   ObjectSetInteger(0nameOBJPROP_XSIZEdx);
   ObjectSetInteger(0nameOBJPROP_YSIZEdy);
   // label on the button
   ObjectSetString(0nameOBJPROP_TEXTbutton);
   
   // pressed (true) / released (false)
   ObjectSetInteger(0nameOBJPROP_STATEstate);
}

A continuación, en OnStart llamamos a esta función dos veces.

void OnStart()
{
   SetupButton("Pressed"10010010020true);
   SetupButton("Normal"10015010020);
}

Los botones resultantes podrían tener este aspecto:

Botones OBJ_BUTTON pulsados y soltados

Botones OBJ_BUTTON pulsados y soltados

Curiosamente, puede hacer clic en cualquiera de los botones con el ratón, y el botón cambiará de estado. Sin embargo, aún no hemos hablado de cómo interceptar una notificación al respecto.

Es importante tener en cuenta que este cambio de estado automático sólo se realiza si la opción Disable selection está marcada en las propiedades del objeto, pero esta condición es la predeterminada para todos los objetos creados mediante programación. Recuerde que, si es necesario, esta selección puede activarse: para ello, debe establecer explícitamente la propiedad OBJPROP_SELECTABLE en true. La hemos utilizado en algunos ejemplos anteriores.

Para eliminar botones que se han vuelto innecesarios, utilice el script ObjectCleanup1.mq5.