Recortar (representar parte) de una imagen

Para objetos gráficos con imágenes (OBJ_BITMAP_LABEL y OBJ_BITMAP), MQL5 permite habilitar la visualización de una parte de la imagen especificada por la propiedad OBJPROP_BMPFILE. Para ello, debe establecer el tamaño del objeto (OBJPROP_XSIZE y OBJPROP_YSIZE) para que sea más pequeño que el de la imagen y establecer las coordenadas de la esquina superior izquierda del fragmento rectangular visible utilizando las propiedades enteras OBJPROP_XOFFSET y OBJPROP_YOFFSET. Estas dos propiedades establecen, respectivamente, la sangría a lo largo de X e Y en píxeles desde los bordes izquierdo y superior de la imagen original.

Representación de parte de una imagen para un objeto

Representación de parte de una imagen para un objeto

Normalmente, para los iconos de las barras de herramientas (conjuntos de botones, menús, etc.) se utiliza una técnica similar que utiliza parte de una imagen grande: un único archivo con todos los iconos proporciona un consumo de recursos más eficiente que muchos archivos pequeños con iconos individuales.

El script de prueba ObjectBitmapOffset.mq5 crea varios paneles con imágenes (OBJ_BITMAP_LABEL), y para todos ellos se especifica el mismo archivo gráfico en la propiedad OBJPROP_BMPFILE. No obstante, debido a las propiedades OBJPROP_XOFFSET y OBJPROP_YOFFSET, todos los objetos muestran diferentes partes de la imagen.

void SetupBitmap(const int iconst int xconst int yconst int size,
   const string imageOnconst string imageOff = NULL)
{
   // create an object
   const string name = ObjNamePrefix + "Tool-" + (string)i;
   ObjectCreate(0nameOBJ_BITMAP_LABEL000);
   ObjectSetInteger(0nameOBJPROP_CORNERCORNER_RIGHT_UPPER);
   ObjectSetInteger(0nameOBJPROP_ANCHORANCHOR_RIGHT_UPPER);
   // position and size
   ObjectSetInteger(0nameOBJPROP_XDISTANCEx);
   ObjectSetInteger(0nameOBJPROP_YDISTANCEy);
   ObjectSetInteger(0nameOBJPROP_XSIZEsize);
   ObjectSetInteger(0nameOBJPROP_YSIZEsize);
   // offset in the original image, according to which the i-th fragment is read
   ObjectSetInteger(0nameOBJPROP_XOFFSETi * size);
   ObjectSetInteger(0nameOBJPROP_YOFFSET0);
   // generic image (file)
   ObjectSetString(0nameOBJPROP_BMPFILEimageOn);
}
   
void OnStart()
{
   const int icon = 46// size of one icon
   for(int i = 0i < 7; ++i// loop through the icons in the file
   {
      SetupBitmap(i1010 + i * iconicon,
         "\\Files\\MQL5Book\\icons-322-46.bmp");
   }
}

La imagen original contiene varios iconos pequeños de 46 x 46 píxeles cada uno. El script los «recorta» uno a uno y los coloca verticalmente en el borde derecho de la ventana.

A continuación se muestra un archivo genérico (/Files/MQL5Book/icons-322-46.bmp) y lo que ha sucedido en el gráfico:

Archivo BMP con iconos

Archivo BMP con iconos

 

Objetos de botón con iconos en el gráfico

Objetos de botón con iconos en el gráfico