ResourceSave

지정된 파일에 리소스를 저장.

bool  ResourceSave(
   const string  resource_name      // 리소스 이름
   const string  file_name          // 파일 이름
   );

매개변수

resource_name

[in]  리소스 이름은 "::"로 시작해야 합니다.

file_name

[in]  MQL5\Files에 상대적인 파일의 이름.

값 반환

성공하는 경우 true, 그렇지 않으면 false. 오류 정보는 GetLastError()로 문의.

주의

이 함수는 항상 파일을 덮어쓰고 필요한 경우 파일 이름에 필요한 모든 중간 디렉터리를 만듭니다.

예:

//--- 그래픽 리소스 매개변수
string ExtResName="Resource";
int    ExtResWidth=100;
int    ExtResHeight=100;
uint   ExtResData[];
int    ExtResSize=ExtResWidth*ExtResHeight;
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError();
//--- 픽셀 배열의 크기를 설정합니다.
   if(ArrayResize(ExtResData,ExtResSize)!=ExtResSize)
     {
      Print("ArrayResize() failed. Error code: ",GetLastError());
      return;
     }
//--- 픽셀 배열을 투명한 색상으로 채우고 이를 기반으로 그래픽 리소스를 만듭니다.
   ArrayInitialize(ExtResData,0x00FFFFFF);
   if(!ResourceCreate(ExtResName,ExtResData,ExtResWidth,ExtResHeight,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("ResourceCreate() failed. Error code: ",GetLastError());
      return;
     }
   Print("Size of created recource array: ",ExtResData.Size());
 
//--- 생성된 그래픽 리소스를 확인합니다.
//--- 현재 바의 시간과 가격 데이터를 가져옵니다.
   MqlTick tick={};
   if(!SymbolInfoTick(Symbol(),tick))
     {
      Print("SymbolInfoTick() failed. Error code: ",GetLastError());
      return;
     }
//--- 마지막 틱 가격과 시간의 좌표를 사용하여 Bitmap 객체를 생성합니다.
   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,ExtResWidth);
   ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,ExtResHeight);
   ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- 비트맵 객체에 대해 이전에 생성된 그래픽 리소스를 이미지 파일로 지정합니다.
//--- 이 경우 사용된 그래픽 리소스의 이름을 나타내기 위해 이름 앞에 "::"를 추가해야 합니다.
   ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+ExtResName);
   
//--- 투명도 200으로 GreenYellow 색상을 설정합니다.
   uint clr=ColorToARGB(clrGreenYellow,200);
//--- 그래픽 리소스의 전체 픽셀 배열을 설정된 색상으로 채웁니다.
   ArrayInitialize(ExtResData,clr);
//--- DodgerBlue 색상을 사용하여 그리드 그리기
   for(int x=0;x<ExtResWidth;x+=9)
      LineVertical(x,0,ExtResHeight,ColorToARGB(clrDodgerBlue,200));
   for(int y=0;y<ExtResHeight;y+=9)
      LineHorizontal(0,ExtResWidth,y,ColorToARGB(clrDodgerBlue,200));
//--- 그래픽 리소스 데이터 업데이트
   Update(ExtResName,ExtResData,ExtResWidth,ExtResHeight,true);
   
//--- 리소스 및 그래픽 객체를 삭제하기 전에 3초 동안 기다립니다.
   Print("Wait 3 seconds before deleting the resource and graphic object");
   Sleep(3000);
 
//--- 리소스를 파일에 저장
   ResetLastError();
   if(!ResourceSave("::"+ExtResName,"ResourceSave\\"+ExtResName+".bmp"))
     {
      Print("ResourceSave() failed. Error code: ",GetLastError());
      return;
     }
//--- 리소스 및 그래픽 객체 이미지 삭제
   if(!ResourceFree("::"+ExtResName))
     {
      Print("ResourceFree() failed. Error code: ",GetLastError());
      return;
     }
   if(!ObjectDelete(0,obj_name))
     {
      Print("ObjectDelete() failed. Error code: ",GetLastError());
      return;
     }
 
//--- 이제 이미지 너비만큼 왼쪽으로 이동한 마지막 틱의 가격과 시간 좌표를 사용하여 "그래픽 라벨" 객체를 생성합니다.
//--- 이전에 받은 마지막 틱 가격과 시간을 사용하여 화면 좌표를 가져옵니다.
   int x=0,y=0;
   if(!ChartTimePriceToXY(0,0,tick.time,tick.bid,x,y))
     {
      Print("ChartTimePriceToXY() failed. Error code: ",GetLastError());
      return;
     }
   obj_name="BitmapLabel";
   if(!ObjectCreate(0,obj_name,OBJ_BITMAP_LABEL,0,0,0))
     {
      Print("ObjectCreate() failed. Error code: ",GetLastError());
      return;
     }
//--- 객체 앵커 포인트를 중심으로 설정합니다.
   ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- 이미지 너비만큼 왼쪽으로 이동한 마지막 틱의 가격 및 시간 좌표를 그래픽 라벨 객체에 설정합니다.
   ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,x-ExtResWidth);
   ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,y);
//--- 이전에 bmp 이미지로 저장한 리소스를 그래픽 라벨 객체에 대해 이미지 파일로 지정합니다.
   ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"\\Files\\ResourceSave\\"+ExtResName+".bmp");
//--- 차트 업데이트
   ChartRedraw();
   
//--- 그래픽 라벨 객체를 삭제하기 전에 3초 동안 기다립니다.
   Print("Wait 3 seconds before deleting the new graphic object");
   Sleep(3000);
   if(!ObjectDelete(0,obj_name))
      Print("ObjectDelete() failed. Error code: ",GetLastError());
  }
//+------------------------------------------------------------------+
//| 그래픽 리소스 데이터 업데이트                                        |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
  {
//--- 0차원이 전달되면 종료
   if(width==0 || height==0)
      return;
//--- 리소스 데이터를 업데이트하고 차트를 다시 그립니다.
   if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
      ChartRedraw();
  }
//+------------------------------------------------------------------+
//| 수직선을 그립니다                                                  |
//+------------------------------------------------------------------+
void LineVertical(int x,int y1,int y2,const uint clr)
  {
   int tmp;
//--- Y로 정렬 
   if(y1>y2)
     {
      tmp=y1;
      y1 =y2;
      y2 =tmp;
     }
//--- 이미지 경계 밖의 선
   if(y2<0 || y1>=ExtResHeight || x<0 || x>=ExtResWidth)
      return;
//--- 이미지 경계 내에 머무르세요
   if(y1<0)
      y1=0;
   if(y2>=ExtResHeight)
      y2=ExtResHeight-1;
//--- 선을 그립니다
   int index=y1*ExtResWidth+x;
   for(int i=y1i<=y2i++,index+=ExtResWidth)
      ExtResData[index]=clr;
  }
//+------------------------------------------------------------------+
//| 수평선 그리기                                                      |
//+------------------------------------------------------------------+
void LineHorizontal(int x1,int x2,int y,const uint clr)
  {
   int tmp;
//--- X로 정렬 
   if(x1>x2)
     {
      tmp=x1;
      x1 =x2;
      x2 =tmp;
     }
//--- 이미지 경계 밖의 선
   if(x2<0 || x1>=ExtResWidth || y<0 || y>=ExtResHeight)
      return;
//--- 이미지 경계 내에 머무르세요
   if(x1<0)
      x1=0;
   if(x2>=ExtResWidth)
      x2=ExtResWidth-1;
//--- 선을 그립니다
   ArrayFill(ExtResData,y*ExtResWidth+x1,(x2-x1)+1,clr);
  }

추가 참조

Resources, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPROP_BMPFILE