Определение точки привязки на объекте

Объекты некоторых типов позволяют выбирать точку привязки. К числу таких типов относятся: текстовая метка (OBJ_TEXT) и растровая картинка (OBJ_BITMAP) с привязкой к котировкам, а также надпись (OBJ_LABEL) и панель с картинкой (OBJ_BITMAP_LABEL), позиционируемые в экранных координатах.

Для чтения и установки точки привязки следует использовать функции ObjectGetInteger и ObjectSetInteger со свойством OBJPROP_ANCHOR.

Все варианты выбора точки собраны в перечислении ENUM_ANCHOR_POINT.

Идентификатор

Расположение точки привязки

ANCHOR_LEFT_UPPER

В левом верхнем углу

ANCHOR_LEFT

Слева по центру

ANCHOR_LEFT_LOWER

В левом нижнем углу

ANCHOR_LOWER

Снизу по центру

ANCHOR_RIGHT_LOWER

В правом нижнем углу

ANCHOR_RIGHT

Справа по центру

ANCHOR_RIGHT_UPPER

В правом верхнем углу

ANCHOR_UPPER

Сверху по центру

ANCHOR_CENTER

Строго по центру объекта

Точки наглядно показаны на изображении ниже, где на график нанесено несколько объектов-надписей.

Текстовые объекты OBJ_LABEL с разными точками привязки

Текстовые объекты OBJ_LABEL с разными точками привязки

Верхняя группа из 4-х надписей имеет одну и ту же пару координат (X,Y), однако из-за привязки к разным углам объекта, они расположены по разные стороны от точки. Похожая ситуация во второй группе из 4-х надписей, однако там привязка сделана к серединам разных сторон объектов. Наконец, внизу отдельно показана надпись с привязкой по её центру, так что точка находится внутри объекта.

Объекты кнопка (OBJ_BUTTON), прямоугольная панель (OBJ_RECTANGLE_LABEL), поле вводе (OBJ_EDIT) и объект-график (OBJ_CHART) имеют фиксированную точку привязки в левом верхнем углу (ANCHOR_LEFT_UPPER).

Некоторые графические объекты группы одиночных ценовых меток (OBJ_ARROW, OBJ_ARROW_THUMB_UP, OBJ_ARROW_THUMB_DOWN, OBJ_ARROW_UP, OBJ_ARROW_DOWN, OBJ_ARROW_STOP, OBJ_ARROW_CHECK) имеют 2 способа привязки своих координат, задаваемые идентификаторами другого перечисления — ENUM_ARROW_ANCHOR.

Идентификатор

Расположение точки привязки

ANCHOR_TOP

Сверху по центру

ANCHOR_BOTTOM

Снизу по центру

Остальные объекты этой группы имеют предопределенные точки привязки: стрелки покупки (OBJ_ARROW_BUY) и продажи (OBJ_ARROW_SELL) — соответственно, посередине верхней и нижней стороны, а ценовые метки (OBJ_ARROW_RIGHT_PRICE, OBJ_ARROW_LEFT_PRICE) — слева и справа.

По аналогии со скриптом ObjectCornerLabel.mq5 из предыдущего раздела создадим скрипт ObjectAnchorLabel.mq5. В новой версии помимо перемещения надписи будем случайным образом менять точку привязки на ней.

Угол окна для привязки будет, как и раньше, выбирать пользователь при запуске скрипта.

input ENUM_BASE_CORNER Corner = CORNER_LEFT_UPPER;

Мы выведем название угла на график в виде комментария.

void OnStart()
{
   Comment(EnumToString(Corner));
   ...

В бесконечном цикле в выбранные моменты генерируется одно из 9 возможных значений точки привязки.

   ENUM_ANCHOR_POINT anchor = 0;
   for( ;!IsStopped(); ++pass)
   {
      if(pass % 50 == 0)
      {
        ...
         anchor = (ENUM_ANCHOR_POINT)(rand() * 9 / 32768);
         ObjectSetInteger(0nameOBJPROP_ANCHORanchor);
      }
      ...

Название точки привязки становится текстовым содержимым надписи, вместе с текущими координатами.

      ObjectSetString(0nameOBJPROP_TEXTEnumToString(anchor)
         + "[" + (string)x + "," + (string)y + "]");

Прочие фрагменты кода остались практически неизменными.

Откомпилировав и запустив скрипт, обратите внимание, как надпись меняет свое положение относительно текущих координат (x,y) в зависимости от выбранной точки привязки.

Пока мы контролируем и предотвращаем выход за пределы окна непосредственно точки привязки. Однако объект имеет некоторые размеры, и потому сейчас может оказаться, что большая часть надписи обрезается. В дальнейшем, после изучения соответствующих свойств, мы займемся этой проблемой (см. пример ObjectSizeLabel.mq5 в разделе Определение ширины и высоты объектов).