ResourceSave
Lưu tài nguyên vào tệp được chỉ định.
cpp
bool ResourceSave(
const string resource_name // Tên tài nguyên
const string file_name // Tên tệp
);
1
2
3
4
2
3
4
Tham số
resource_name
[truyền vào] Tên của tài nguyên, phải bắt đầu bằng "::".
file_name
[truyền vào] Tên của tệp tương đối với thư mục MQL5\Files.
Giá trị trả về
Trả về true
nếu thành công, ngược lại trả về false
. Để biết thông tin về lỗi, gọi hàm GetLastError()
.
Ghi chú
Hàm luôn ghi đè tệp và tạo tất cả các thư mục trung gian cần thiết trong tên tệp nếu cần.
Ví dụ:
cpp
//--- tham số tài nguyên đồ họa
string ExtResName="Resource";
int ExtResWidth=100;
int ExtResHeight=100;
uint ExtResData[];
int ExtResSize=ExtResWidth*ExtResHeight;
//+------------------------------------------------------------------+
//| Hàm khởi động chương trình script |
//+------------------------------------------------------------------+
void OnStart()
{
ResetLastError();
//--- đặt kích thước của mảng pixel
if(ArrayResize(ExtResData,ExtResSize)!=ExtResSize)
{
Print("ArrayResize() failed. Error code: ",GetLastError());
return;
}
//--- điền mảng pixel với màu trong suốt và tạo tài nguyên đồ họa dựa trên nó
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());
//--- kiểm tra tài nguyên đồ họa đã tạo
//--- lấy dữ liệu thời gian và giá của thanh hiện tại
MqlTick tick={};
if(!SymbolInfoTick(Symbol(),tick))
{
Print("SymbolInfoTick() failed. Error code: ",GetLastError());
return;
}
//--- tạo đối tượng Bitmap sử dụng tọa độ của giá và thời gian tick cuối cùng
string obj_name="Bitmap";
if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
{
Print("ObjectCreate() failed. Error code: ",GetLastError());
return;
}
//--- đặt chiều rộng và chiều cao của đối tượng bitmap đã tạo bằng chiều rộng và chiều cao của tài nguyên đồ họa
//--- đặt điểm neo của đối tượng vào trung tâm của nó
ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,ExtResWidth);
ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,ExtResHeight);
ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- chỉ định tài nguyên đồ họa đã tạo trước đó cho đối tượng bitmap dưới dạng tệp hình ảnh
//--- trong trường hợp này, để chỉ ra tên của tài nguyên đồ họa được sử dụng, cần thêm "::" trước tên của nó
ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+ExtResName);
//--- đặt màu GreenYellow với độ trong suốt 200
uint clr=ColorToARGB(clrGreenYellow,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa với màu đã đặt
ArrayInitialize(ExtResData,clr);
//--- vẽ lưới bằng màu 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));
//--- cập nhật dữ liệu tài nguyên đồ họa
Update(ExtResName,ExtResData,ExtResWidth,ExtResHeight,true);
//--- chờ 3 giây trước khi xóa tài nguyên và đối tượng đồ họa
Print("Wait 3 seconds before deleting the resource and graphic object");
Sleep(3000);
//--- lưu tài nguyên vào tệp
ResetLastError();
if(!ResourceSave("::"+ExtResName,"ResourceSave\\"+ExtResName+".bmp"))
{
Print("ResourceSave() failed. Error code: ",GetLastError());
return;
}
//--- xóa tài nguyên và hình ảnh đối tượng đồ họa
if(!ResourceFree("::"+ExtResName))
{
Print("ResourceFree() failed. Error code: ",GetLastError());
return;
}
if(!ObjectDelete(0,obj_name))
{
Print("ObjectDelete() failed. Error code: ",GetLastError());
return;
}
//--- bây giờ tạo đối tượng "Nhãn đồ họa" sử dụng tọa độ của giá và thời gian của tick cuối cùng, dịch chuyển sang trái bằng chiều rộng hình ảnh
//--- lấy tọa độ màn hình bằng cách sử dụng giá và thời gian tick cuối cùng đã nhận trước đó
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;
}
//--- đặt điểm neo của đối tượng vào trung tâm của nó
ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- đặt tọa độ của giá và thời gian của tick cuối cùng, dịch chuyển sang trái bằng chiều rộng hình ảnh, cho đối tượng nhãn đồ họa
ObjectSetInteger(0,obj_name,OBJPROP_XDISTANCE,x-ExtResWidth);
ObjectSetInteger(0,obj_name,OBJPROP_YDISTANCE,y);
//--- chỉ định tài nguyên, đã được lưu trước đó dưới dạng hình ảnh bmp, cho đối tượng nhãn đồ họa dưới dạng tệp hình ảnh
ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"\\Files\\ResourceSave\\"+ExtResName+".bmp");
//--- cập nhật biểu đồ
ChartRedraw();
//--- chờ 3 giây trước khi xóa đối tượng nhãn đồ họa
Print("Wait 3 seconds before deleting the new graphic object");
Sleep(3000);
if(!ObjectDelete(0,obj_name))
Print("ObjectDelete() failed. Error code: ",GetLastError());
}
//+------------------------------------------------------------------+
//| Cập nhật dữ liệu tài nguyên đồ họa |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
{
//--- rời khỏi nếu kích thước bằng 0 được truyền vào
if(width==0 || height==0)
return;
//--- cập nhật dữ liệu tài nguyên và vẽ lại biểu đồ
if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Vẽ một đường thẳng đứng |
//+------------------------------------------------------------------+
void LineVertical(int x,int y1,int y2,const uint clr)
{
int tmp;
//--- sắp xếp theo Y
if(y1>y2)
{
tmp=y1;
y1 =y2;
y2 =tmp;
}
//--- đường thẳng nằm ngoài ranh giới hình ảnh
if(y2<0 || y1>=ExtResHeight || x<0 || x>=ExtResWidth)
return;
//--- giữ trong ranh giới hình ảnh
if(y1<0)
y1=0;
if(y2>=ExtResHeight)
y2=ExtResHeight-1;
//--- vẽ đường thẳng
int index=y1*ExtResWidth+x;
for(int i=y1; i<=y2; i++,index+=ExtResWidth)
ExtResData[index]=clr;
}
//+------------------------------------------------------------------+
//| Vẽ một đường ngang |
//+------------------------------------------------------------------+
void LineHorizontal(int x1,int x2,int y,const uint clr)
{
int tmp;
//--- sắp xếp theo X
if(x1>x2)
{
tmp=x1;
x1 =x2;
x2 =tmp;
}
//--- đường thẳng nằm ngoài ranh giới hình ảnh
if(x2<0 || x1>=ExtResWidth || y<0 || y>=ExtResHeight)
return;
//--- giữ trong ranh giới hình ảnh
if(x1<0)
x1=0;
if(x2>=ExtResWidth)
x2=ExtResWidth-1;
//--- vẽ đường thẳng
ArrayFill(ExtResData,y*ExtResWidth+x1,(x2-x1)+1,clr);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
Xem thêm
Resources
, ObjectCreate()
, PlaySound()
, ObjectSetString()
, OBJPROP_BMPFILE