图像的裁剪(输出部分)

对于带有图片的图形对象(OBJ_BITMAP_LABEL 和 OBJ_BITMAP),MQL5 允许通过 OBJPROP_BMPFILE特性指定要显示的图像部分。要实现这一点,需要将对象的大小(OBJPROP_XSIZE 和 OBJPROP_YSIZE)设置为小于图像尺寸,并使用整数特性 OBJPROP_XOFFSET 和 OBJPROP_YOFFSET 设置可见矩形区域的左上角坐标。这两个特性分别设置从原始图像左边界和上边界开始的 X 轴和 Y 轴像素偏移量。

将图像的一部分输出到一个对象

将图像的一部分输出到一个对象

通常,工具栏图标(按钮组、菜单等)会使用大型图像的局部区域来实现类似效果:相比用多个小文件储存单独图标,用一个文件储存所有图标更能高效利用资源。

测试脚本ObjectBitmapOffset.mq5创建了多个带图片的面板 (OBJ_BITMAP_LABEL),并且为所有这些面板在 OBJPROP_BMPFILE 特性中指定了相同的图形文件。然而,通过设置 OBJPROP_XOFFSET 和 OBJPROP_YOFFSET 特性,所有对象将显示图像的不同部分。

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

原始图像包含多个小图标,每个图标的尺寸为 46×46 像素。该脚本会将这些图标逐一“裁剪”出来,并垂直排列在窗口的右侧边缘。

以下展示了一个通用文件(/Files/MQL5Book/icons-322-46.bmp),以及在图表上的呈现效果。

含图标的 BMP 文件

含图标的 BMP 文件

 

图表上带图标的按钮对象

图表上带图标的按钮对象