Góc cửa sổ neo và tọa độ màn hình
Đối với các đối tượng sử dụng hệ tọa độ dưới dạng điểm (pixel) trên biểu đồ, bạn phải chọn một trong bốn góc của cửa sổ, từ đó các giá trị dọc theo trục ngang X và trục dọc Y sẽ được tính đến điểm neo trên đối tượng. Các khía cạnh này được kiểm soát bởi các thuộc tính trong bảng sau.
Định danh | Mô tả | Kiểu |
---|---|---|
OBJPROP_CORNER | Góc biểu đồ để neo đối tượng đồ họa | ENUM_BASE_CORNER |
OBJPROP_XDISTANCE | Khoảng cách tính bằng pixel dọc trục X từ góc neo | int |
OBJPROP_YDISTANCE | Khoảng cách tính bằng pixel dọc trục Y từ góc neo | int |
Các tùy chọn hợp lệ cho OBJPROP_CORNER
được tóm tắt trong liệt kê ENUM_BASE_CORNER
.
Định danh | Vị trí trung tâm tọa độ |
---|---|
CORNER_LEFT_UPPER | Góc trên bên trái của cửa sổ |
CORNER_LEFT_LOWER | Góc dưới bên trái của cửa sổ |
CORNER_RIGHT_LOWER | Góc dưới bên phải của cửa sổ |
CORNER_RIGHT_UPPER | Góc trên bên phải của cửa sổ |
Mặc định là góc trên bên trái.
Hình sau cho thấy bốn đối tượng Button có cùng kích thước và khoảng cách từ góc neo trong cửa sổ. Mỗi đối tượng này chỉ khác nhau ở góc neo. Nhớ rằng các nút có một điểm neo luôn nằm ở góc trên bên trái của nút.
Sắp xếp các đối tượng được neo vào các góc khác nhau của cửa sổ chính
Cả bốn đối tượng hiện đang được chọn trên biểu đồ, vì vậy các điểm neo của chúng được tô sáng bằng màu tương phản.
Khi nói về các góc cửa sổ, chúng ta muốn nói đến cửa sổ hoặc cửa sổ phụ cụ thể nơi đối tượng được đặt, không phải toàn bộ biểu đồ. Nói cách khác, trong các đối tượng ở cửa sổ phụ, tọa độ Y được đo từ biên trên hoặc dưới của cửa sổ phụ này.
Hình minh họa sau cho thấy các đối tượng tương tự trong một cửa sổ phụ, được neo vào các góc của cửa sổ phụ.
Vị trí các đối tượng được neo vào các góc khác nhau của cửa sổ phụ
Sử dụng script ObjectCornerLabel.mq5
, người dùng có thể kiểm tra chuyển động của một dòng chữ, trong đó góc neo trong cửa sổ được chỉ định trong tham số đầu vào Corner
.
#property script_show_inputs
input ENUM_BASE_CORNER Corner = CORNER_LEFT_UPPER;
2
3
Tọa độ thay đổi định kỳ và được hiển thị trong chính văn bản của dòng chữ. Do đó, dòng chữ di chuyển trong cửa sổ và khi chạm đến biên, nó sẽ bật ngược lại. Đối tượng được tạo trong cửa sổ hoặc cửa sổ phụ nơi script được thả bằng chuột.
void OnStart()
{
const int t = ChartWindowOnDropped();
const string legend = EnumToString(Corner);
const string name = "ObjCornerLabel-" + legend;
int h = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, t);
int w = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
int x = w / 2;
int y = h / 2;
...
2
3
4
5
6
7
8
9
10
11
Để định vị chính xác, chúng ta tìm kích thước của cửa sổ (và sau đó kiểm tra xem chúng có thay đổi không) và tìm điểm giữa để đặt đối tượng ban đầu: các biến với tọa độ x
và y
.
Tiếp theo, chúng ta tạo và thiết lập một dòng chữ, chưa có tọa độ. Điều quan trọng là chúng ta bật khả năng chọn đối tượng (OBJPROP_SELECTABLE
) và chọn nó (OBJPROP_SELECTED
), vì điều này cho phép chúng ta thấy điểm neo trên chính đối tượng, nơi khoảng cách từ góc cửa sổ (trung tâm tọa độ) được đo. Hai thuộc tính này được mô tả chi tiết hơn trong phần Quản lý trạng thái đối tượng.
ObjectCreate(0, name, OBJ_LABEL, t, 0, 0);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
ObjectSetInteger(0, name, OBJPROP_CORNER, Corner);
...
2
3
4
5
Trong các biến px
và py
, chúng ta sẽ ghi lại các gia số của tọa độ để mô phỏng chuyển động. Việc sửa đổi tọa độ sẽ được thực hiện trong một vòng lặp vô hạn cho đến khi bị người dùng ngắt. Bộ đếm lặp sẽ cho phép định kỳ, cứ sau 50 lần lặp, thay đổi hướng di chuyển một cách ngẫu nhiên.
int px = 0, py = 0;
int pass = 0;
for( ;!IsStopped(); ++pass)
{
if(pass % 50 == 0)
{
h = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, t);
w = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
px = rand() * (w / 20) / 32768 - (w / 40);
py = rand() * (h / 20) / 32768 - (h / 40);
}
// bật ngược lại từ biên cửa sổ để đối tượng không bị ẩn
if(x + px > w || x + px < 0) px = -px;
if(y + py > h || y + py < 0) py = -py;
// tính toán lại vị trí nhãn
x += px;
y += py;
// cập nhật tọa độ của đối tượng và thêm chúng vào văn bản
ObjectSetString(0, name, OBJPROP_TEXT, legend
+ "[" + (string)x + "," + (string)y + "]");
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ChartRedraw();
Sleep(100);
}
ObjectDelete(0, name);
}
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
Hãy thử chạy script nhiều lần, chỉ định các góc neo khác nhau.
Trong phần tiếp theo, chúng ta sẽ bổ sung script này bằng cách cũng kiểm soát điểm neo trên đối tượng.