Eventos de objetos gráficos
Para los objetos gráficos situados en el gráfico, el terminal genera varios eventos especializados. La mayoría de ellos se aplican a objetos de cualquier tipo. El evento de fin de edición de texto en el campo de entrada (CHARTEVENT_OBJECT_ENDEDIT) se genera sólo para objetos del tipo OBJ_EDIT.
Los eventos de clic de objeto (CHARTEVENT_OBJECT_CLICK), arrastre de ratón (CHARTEVENT_OBJECT_DRAG) y cambio de propiedades de objeto (CHARTEVENT_OBJECT_CHANGE) están siempre activos, mientras que los eventos de creación de objetos CHARTEVENT_OBJECT_CREATE y CHARTEVENT_OBJECT_DELETE requieren una habilitación explícita mediante la configuración de las propiedades relevantes del gráfico: CHART_EVENT_OBJECT_CREATE y CH ART_EVENT_OBJECT_DELETE.
Al renombrar un objeto manualmente (desde el cuadro de diálogo de propiedades), el terminal genera una secuencia de eventos CHARTEVENT_OBJECT_DELETE, CHARTEVENT_OBJECT_CREATE, CHARTEVENT_OBJECT_CHANGE. Cuando se renombra un objeto mediante programación, estos eventos no se generan.
Todos los eventos en objetos llevan el nombre del objeto asociado en el parámetro sparam de la función OnChartEvent.
Además, las coordenadas de clic se pasan para CHARTEVENT_OBJECT_CLICK: X en el parámetro lparam e Y en el parámetro dparam. Las coordenadas son comunes a todo el gráfico, incluidas las subventanas.
Hacer clic en los objetos funciona de forma diferente dependiendo del tipo de objeto. Para algunos, como la elipse, el cursor debe estar sobre cualquier punto de anclaje. Para otros (triángulo, rectángulo, líneas), el cursor puede estar sobre el perímetro del objeto, no sólo sobre un punto. En todos estos casos, al pasar el cursor del ratón por encima de la zona interactiva del objeto aparece una información sobre herramientas con el nombre del objeto.
Los objetos vinculados a coordenadas de pantalla, que permiten formar la interfaz gráfica del programa, en concreto, un botón, un campo de entrada y un panel rectangular, generan eventos cuando se hace clic con el ratón en cualquier parte del objeto.
Si hay varios objetos bajo el cursor, se genera un evento para el objeto con la Prioridad Z más alta. Si las prioridades de los objetos son iguales, el suceso se asigna al que se creó más tarde (esto se corresponde con su presentación visual, es decir, el posterior se superpone al anterior).
La nueva versión del indicador le ayudará a comprobar los eventos en los objetos EventAllObjects.mq5. Lo crearemos y configuraremos utilizando la clase ya conocida Object Selector de varios objetos, para luego interceptar en el manejador OnChartEvent sus eventos característicos.
#include <MQL5Book/ObjectMonitor.mqh>
|
Inicialmente, en OnInit creamos un objeto botón y una línea vertical. Para la línea, realizaremos el seguimiento del evento de movimiento (arrastre) y, al pulsar el botón, crearemos un campo de entrada para el que comprobaremos el texto introducido.
const string ObjNamePrefix = "EventShow-";
|
Por el camino, no olvide establecer las propiedades del gráfico CHART_EVENT_OBJECT_CREATE y CHART_EVENT_OBJECT_DELETE en true para ser notificado cuando un conjunto de objetos cambie.
En la función OnChartEvent, proporcionaremos una respuesta adicional a los eventos requeridos: una vez finalizado el arrastre, mostraremos la nueva posición de la línea en el registro y, tras editar el texto del campo de entrada, su contenido.
void OnChartEvent(const int id,
|
Tenga en cuenta que, cuando se pulsa el botón por primera vez, su estado cambia de liberado a pulsado, y en respuesta a esto, creamos un campo de entrada. Si vuelve a pulsar el botón, volverá a cambiar su estado, con lo que el campo de entrada desaparecerá del gráfico.
A continuación se muestra una imagen del gráfico durante el funcionamiento del indicador.

Objetos controlados por el manejador de eventos OnChartEvent
Inmediatamente después de lanzar el indicador, aparecen las siguientes líneas en el registro:
CHARTEVENT_OBJECT_CREATE 0 0.000000 'EventShow-Button'
|
Si a continuación arrastramos la línea con el ratón, veremos algo parecido a esto:
CHARTEVENT_OBJECT_DRAG 0 0.000000 'EventShow-VLine'
|
A continuación, puede hacer clic en el botón y editar el texto en el campo de entrada recién creado (cuando termine la edición, haga clic en Enter o fuera del campo de entrada). Esto dará lugar a las siguientes entradas en el registro (las coordenadas y el texto del mensaje pueden diferir; aquí se ha introducido el texto «nuevo mensaje»):
CHARTEVENT_OBJECT_CLICK 181 113.000000 'EventShow-Button'
|
Si suelta el botón, el campo de entrada se borrará.
CHARTEVENT_OBJECT_CLICK 162 109.000000 'EventShow-Button'
|
Cabe señalar que el botón funciona por defecto como un interruptor de dos posiciones, es decir, se mantiene alternativamente en el estado pulsado o liberado como resultado de un clic del ratón. Para un botón normal, este comportamiento es redundante: para realizar un simple seguimiento de las pulsaciones de botón, debe devolverlo al estado liberado al procesar el evento llamando a ObjectSetInteger(0, ButtonName, OBJPROP_STATE, false).