Настройки шрифта

Во всех типах объектов поддерживается возможность задать для них текст (OBJPROP_TEXT). Многие из них выводят указанный текст непосредственно на графике, для остальных он становится информативной частью всплывающей подсказки.

Когда текст отображается внутри объекта (т.е. для типов OBJ_TEXT, OBJ_LABEL, OBJ_BUTTON, OBJ_EDIT), допустимо выбрать название и размер шрифта. Для объектов остальных типов применение настроек шрифта не имеет силы: их описания всегда выводятся стандартным шрифтом графика.

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

Описание

Тип

OBJPROP_FONTSIZE

Размер шрифта в пикселях

int

OBJPROP_FONT

Шрифт

string

Задать размер шрифта в типографских пунктах здесь нельзя.

Тестовый скрипт ObjectFont.mq5 создает объекты с текстом и изменяет название и размер шрифта. Воспользуемся в нем классом ObjectBuilder из предыдущего скрипта.

В начале OnStart вычисляется середина окна, как в экранных координатах, так в осях время/цена — это требуется, потому что объекты разных типов, участвующие в тесте, используют разные системы координат.

void OnStart()
{
   const string name = "ObjFont-";
   
   const int bars = (int)ChartGetInteger(0CHART_WIDTH_IN_BARS);
   const int first = (int)ChartGetInteger(0CHART_FIRST_VISIBLE_BAR);
   
   const datetime centerTime = iTime(NULL0first - bars / 2);
   const double centerPrice =
      (ChartGetDouble(0CHART_PRICE_MIN)
      + ChartGetDouble(0CHART_PRICE_MAX)) / 2;
   
   const int centerX = (int)ChartGetInteger(0CHART_WIDTH_IN_PIXELS) / 2;
   const int centerY = (int)ChartGetInteger(0CHART_HEIGHT_IN_PIXELS) / 2;
   ...

Перечень тестируемых типов объектов указан в массиве types. Для некоторых из них, в частности, OBJ_HLINE и OBJ_VLINE настройки шрифта не будут иметь эффекта, хотя текст описаний появится на экране (чтобы это гарантировать мы включаем режим CHART_SHOW_OBJECT_DESCR).

   ChartSetInteger(0CHART_SHOW_OBJECT_DESCRtrue);
   
   ENUM_OBJECT types[] =
   {
      OBJ_HLINE,
      OBJ_VLINE,
      OBJ_TEXT,
      OBJ_LABEL,
      OBJ_BUTTON,
      OBJ_EDIT,
   };
   int t = 0// курсор
   ...

Переменная t будет использоваться для последовательного переключения с одного типа на другой.

В массиве fonts собраны наиболее популярные стандартные шрифты Windows.

   string fonts[] =
   {
      "Comic Sans MS",
      "Consolas",
      "Courier New",
      "Lucida Console",
      "Microsoft Sans Serif",
      "Segoe UI",
      "Tahoma",
      "Times New Roman",
      "Trebuchet MS",
      "Verdana"
   };
   
   int f = 0// курсор
   ...

Их мы будем перебирать с помощью переменной f.

Внутри демонстрационного цикла поручаем ObjectBuilder создать объект текущего типа types[t] в середине окна (для унификации координаты задаются в обеих системах координат, чтобы не делать различия в коде в зависимости от типа: неподдерживаемые объектом координаты просто не будут иметь эффекта).

   while(!IsStopped())
   {
      
      const string str = EnumToString(types[t]);
      ObjectBuilder *object = new ObjectBuilder(name + strtypes[t]);
      object.set(OBJPROP_TIMEcenterTime);
      object.set(OBJPROP_PRICEcenterPrice);
      object.set(OBJPROP_XDISTANCEcenterX);
      object.set(OBJPROP_YDISTANCEcenterY);
      object.set(OBJPROP_XSIZEcenterX / 3 * 2);
      object.set(OBJPROP_YSIZEcenterY / 3 * 2);
      ...

Далее настраиваем текст и шрифт (размер выбирается случайно).

      const int size = rand() * 15 / 32767 + 8;
      Comment(str + " " + fonts[f] + " " + (string)size);
      object.set(OBJPROP_TEXTfonts[f] + " " + (string)size);
      object.set(OBJPROP_FONTfonts[f]);
      object.set(OBJPROP_FONTSIZEsize);
      ...

Для следующего прохода передвигаем курсоры в массивах типов объектов и названий шрифтов.

      t = ++t % ArraySize(types);
      f = ++f % ArraySize(fonts);
      ...

Наконец, обновляем график, ждем 1 секунду и удаляем объект, чтобы создать очередной.

      ChartRedraw();
      Sleep(1000);
      delete object;
   }
}

На изображении ниже показан момент работы скрипта.

Кнопка с нестандартными настройками шрифта

Кнопка с нестандартными настройками шрифта