ResourceReadImage

函数阅读来自通过ResourceCreate()函数创建的编译期间保存在 EX5 文件的图形资源的数据。

bool  ResourceReadImage(
   const string      resource_name,       // 用于阅读的图形资源名称
   uint&             data[],              // 用于从资源接收数据的数组
   uint&             width,               // 用于在资源中接收图像宽度
   uint&             height,              // 用于在资源中接收图像高度
   );

参数

resource_name

[in]  包含图像的图形资源的名称。若要访问它的资源,以简单形式使用名称"::resourcename"。如果我们从编译的EX5文件下载资源,全名应该和相对于MQL5目录的路径,文件和资源名称一起使用 – "path\\filename.ex5::resourcename"。

data[][]

[in]  接收图形资源数据的一维或二维数组。

img_width

[out]  图形资源图像的像素宽度。

img_height

[out]  图形资源图像的像素高度。

返回值

如果成功返回true,否则false。若要获得有关错误的信息,请调用GetLastError() 函数。

注意

如果data[] 数组被用于创建图形资源 COLOR_FORMAT_ARGB_NORMALIZE 或 COLOR_FORMAT_XRGB_NOALPHA 颜色格式应该被使用。

如果data[] 数组是二维数组并且它的第二维度小于X(宽度)图形资源大小,那么ResourceReadImage() 函数返回false 并且阅读不被执行。但是如果资源存在,实际图像大小返回到宽度和高度参数。这将允许采取另外尝试接收资源数据。

示例:

//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 声明图形资源的参数
   string rc_name="Resource";
   uint   rc_width=100;
   uint   rc_height=100;
   uint   rc_data[];
   uint   rc_size=rc_width*rc_height;
 
   ResetLastError();
//--- 设置像素数组的大小
   if(ArrayResize(rc_data,rc_size)!=rc_size)
     {
      Print("ArrayResize() failed. Error code: ",GetLastError());
      return;
     }
//--- 用透明颜色填充像素数组,并在此基础上创建图形资源
   ArrayInitialize(rc_data,0x00FFFFFF);
   if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("ResourceCreate() failed. Error code: ",GetLastError());
      return;
     }
   Print("Size of created recource array: ",rc_data.Size());
 
//--- 查看已创建的图形资源。
//--- 获取当前柱形图的时间和价格数据
   MqlTick tick={};
   if(!SymbolInfoTick(Symbol(),tick))
     {
      Print("SymbolInfoTick() failed. Error code: ",GetLastError());
      return;
     }
//--- 使用最后报价和时间的坐标创建位图对象
   string obj_name="Bitmap";
   if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
     {
      Print("ObjectCreate() failed. Error code: ",GetLastError());
      return;
     }
//--- 将创建的位图对象的宽度和高度设置为图形资源的宽度和高度。
//--- 将对象定位点设置为其中心。
   ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);
   ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);
   ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- 将前面为位图对象创建的图形资源指定为图像文件
//--- 在这种情况下,为了指示所使用的图形资源的名称,我们需要在其名称之前添加“::”
   ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);
   
//--- 设置DodgerBlue的透明度为200
   uint clr=ColorToARGB(clrDodgerBlue,200);
//--- 用设置的颜色填充图形资源的整个像素数组
   ArrayInitialize(rc_data,clr);
//--- 更新图形资源数据
   Update(rc_name,rc_data,rc_width,rc_height,true);
   
//--- 等待3秒再读取图形资源数据
   Print("Wait 3 seconds before ResourceReadImage()");
   Sleep(3000);
//--- 将图像从资源读入新的像素数组
   uint rc_data_copy[];
   uint w=0,h=0;
   ResetLastError();
   if(!ResourceReadImage("::"+rc_name,rc_data_copy,w,h))
     {
      Print("ResourceReadImage() failed. Error code: ",GetLastError());
      return;
     }
 
//--- 设置OrangeRed的透明度为200
   clr=ColorToARGB(clrOrangeRed,200);
//--- 用设置的颜色填充图形资源的整个像素数组,并在此基础上创建新的图形资源
   ArrayInitialize(rc_data_copy,clr);
   if(!ResourceCreate(rc_name+"Copy",rc_data_copy,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("New ResourceCreate() failed. Error code: ",GetLastError());
      return;
     }
   Print("Size of created new recource array: ",rc_data_copy.Size());
   
//--- 使用最后报价和时间的坐标创建“图形标签”对象
   string obj_name2="BitmapLabel";
   if(!ObjectCreate(0,obj_name2,OBJ_BITMAP_LABEL,0,0,0))
     {
      Print("ObjectCreate() failed. Error code: ",GetLastError());
      return;
     }
//--- 使用之前接收到的价格和时间获取屏幕坐标
   int x=0,y=0;
   if(!ChartTimePriceToXY(0,0,tick.time,tick.bid,x,y))
     {
      Print("New ChartTimePriceToXY() failed. Error code: ",GetLastError());
      return;
     }
//--- 将创建的图形标签对象的宽度和高度设置为图形资源的宽度和高度。
//--- 将对象定位点设置为其中心。
   ObjectSetInteger(0,obj_name2,OBJPROP_XSIZE,rc_width);
   ObjectSetInteger(0,obj_name2,OBJPROP_YSIZE,rc_height);
   ObjectSetInteger(0,obj_name2,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
   ObjectSetInteger(0,obj_name2,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,obj_name2,OBJPROP_YDISTANCE,y);
//--- 将复制的图形资源设置为图形标签对象的图像文件
//--- 在这种情况下,为了指示所使用的图形资源的名称,我们需要在其名称之前添加“::”
   ObjectSetString(0,obj_name2,OBJPROP_BMPFILE,"::"+rc_name+"Copy");
   
//--- 更改新图形标签对象的颜色
   Print("Wait 3 seconds before changing color to GreenYellow");
   Sleep(3000);
//--- 设置GreenYellow的透明度为200
   clr=ColorToARGB(clrGreenYellow,200);
//--- 用设置的颜色填充图形资源的整个像素数组
   ArrayInitialize(rc_data_copy,clr);
//--- 更新图形资源数据
   Update(rc_name+"Copy",rc_data_copy,rc_width,rc_height,true);
   
//--- 等待3秒,删除资源和两个对象
   Print("Wait 3 seconds before deleting both objects");
   Sleep(3000);
   Print("Deleting Resource and all Bitmap objects");
   ResourceFree("::"+rc_name);
   ResourceFree("::"+rc_name+"Copy");
   ObjectDelete(0,obj_name);
   ObjectDelete(0,obj_name2);
  }
//+------------------------------------------------------------------+
//| 更新图形资源数据                                                   |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
  {
//--- 如果传递的维度为零,则离开
   if(width==0 || height==0)
      return;
//--- 更新资源数据并重新绘制图表
   if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
      ChartRedraw();
  }

另见

资源ObjectCreate()ObjectSetString()OBJPROP_BMPFILE