Anclar la esquina de la ventana y las coordenadas de la pantalla

Para los objetos que utilizan un sistema de coordenadas en forma de puntos (píxeles) en el gráfico, debe seleccionar una de las cuatro esquinas de la ventana, con respecto a la cual se contarán los valores a lo largo del eje horizontal X y del eje vertical Y hasta el punto de anclaje en el objeto. Estos aspectos se controlan mediante las propiedades de la tabla siguiente:

Identificador

Descripción

Tipo

OBJPROP_CORNER

Esquina del gráfico para anclar el objeto gráfico

ENUM_BASE_CORNER

OBJPROP_XDISTANCE

Distancia en píxeles a lo largo del eje X desde la esquina de anclaje

int

OBJPROP_YDISTANCE

Distancia en píxeles a lo largo del eje Y desde la esquina de anclaje

int

Las opciones válidas para OBJPROP_CORNER se resumen en la enumeración ENUM_BASE_CORNER.

Identificador

Ubicación del centro de coordenadas

CORNER_LEFT_UPPER

Esquina superior izquierda de la ventana

CORNER_LEFT_LOWER

Esquina inferior izquierda de la ventana

CORNER_RIGHT_LOWER

Esquina inferior derecha de la ventana

CORNER_RIGHT_UPPER

Esquina superior derecha de la ventana

El valor predeterminado es la esquina superior izquierda.

En la siguiente figura se muestran cuatro objetos Botón con el mismo tamaño y distancia desde la esquina de anclaje en la ventana. Cada uno de estos objetos sólo difiere en el ángulo de unión. Recuerde que los botones tienen un punto de anclaje que siempre está situado en la esquina superior izquierda del botón.

Disposición de objetos con vinculación a distintas esquinas de la ventana principal

Disposición de objetos vinculados a distintas esquinas de la ventana principal

Los cuatro objetos están actualmente seleccionados en el gráfico, por lo que sus puntos de anclaje aparecen resaltados en un color contrastado.

Cuando hablamos de esquinas de ventana nos referimos a la ventana o subventana concreta en la que se encuentra el objeto y no a todo el gráfico. En otras palabras: en los objetos de las subventanas, la coordenada Y se mide desde el borde superior o inferior de esta subventana.

En la siguiente ilustración se muestran objetos similares en una subventana, ajustados a las esquinas de la subventana.

Ubicación de objetos con vinculación a diferentes esquinas de la subventana

Ubicación de objetos con vinculación a diferentes esquinas de la subventana

Mediante el script ObjectCornerLabel.mq5 el usuario puede probar el movimiento de una inscripción de texto, para lo cual el ángulo de anclaje en la ventana se especifica en el parámetro de entrada Corner.

#property script_show_inputs
   
input ENUM_BASE_CORNER Corner = CORNER_LEFT_UPPER;

Las coordenadas cambian periódicamente y aparecen en el texto de la propia inscripción. Así, la inscripción se desplaza en la ventana y, cuando llega al borde, rebota en él. El objeto se crea en la ventana o subventana en la que se soltó el script mediante el ratón.

void OnStart()
{
   const int t = ChartWindowOnDropped();
   const string legend = EnumToString(Corner);
   
   const string name = "ObjCornerLabel-" + legend;
   int h = (int)ChartGetInteger(0CHART_HEIGHT_IN_PIXELSt);
   int w = (int)ChartGetInteger(0CHART_WIDTH_IN_PIXELS);
   int x = w / 2;
   int y = h / 2;
   ...

Para un posicionamiento correcto, hallamos las dimensiones de la ventana (y a continuación comprobamos si han cambiado) y buscamos el punto medio para la colocación inicial del objeto: las variables con las coordenadas x y y.

A continuación, creamos y configuramos una inscripción, sin coordenadas todavía. Es importante tener en cuenta que habilitamos la posibilidad de seleccionar un objeto (OBJPROP_SELECTABLE) y seleccionarlo (OBJPROP_SELECTED), ya que esto nos permite ver el punto de anclaje en el propio objeto, con el que se mide la distancia desde la esquina de la ventana (centro de coordenadas). Estas dos propiedades se describen con más detalle en la sección sobre Gestión del estado de los objetos.

   ObjectCreate(0nameOBJ_LABELt00);
   ObjectSetInteger(0nameOBJPROP_SELECTABLEtrue);
   ObjectSetInteger(0nameOBJPROP_SELECTEDtrue);
   ObjectSetInteger(0nameOBJPROP_CORNERCorner);
   ...

En las variables px y py, registraremos los incrementos de coordenadas para la emulación del movimiento. La propia modificación de coordenadas se realizará en un bucle infinito hasta que sea interrumpida por el usuario. El contador de iteraciones permitirá periódicamente, cada 50 iteraciones, cambiar la dirección del movimiento de forma aleatoria.

   int px = 0py = 0;
   int pass = 0;
   
   for( ;!IsStopped(); ++pass)
   {
      if(pass % 50 == 0)
      {
         h = (int)ChartGetInteger(0CHART_HEIGHT_IN_PIXELSt);
         w = (int)ChartGetInteger(0CHART_WIDTH_IN_PIXELS);
         px = rand() * (w / 20) / 32768 - (w / 40);
         py = rand() * (h / 20) / 32768 - (h / 40);
      }
   
      // bounce off window borders so object doesn't hide
      if(x + px > w || x + px < 0px = -px;
      if(y + py > h || y + py < 0py = -py;
      // recalculate label positions
      x += px;
      y += py;
      
      // update the coordinates of the object and add them to the text
      ObjectSetString(0nameOBJPROP_TEXTlegend
         + "[" + (string)x + "," + (string)y + "]");
      ObjectSetInteger(0nameOBJPROP_XDISTANCEx);
      ObjectSetInteger(0nameOBJPROP_YDISTANCEy);
   
      ChartRedraw();
      Sleep(100);
   }
   
   ObjectDelete(0name);
}

Intente ejecutar el script varias veces, especificando diferentes esquinas de anclaje.

En la siguiente sección aumentaremos este script controlando también el punto de anclaje en el objeto.