字体设置

所有类型的对象都支持为其设置特定文本 (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// cursor
   ...

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// cursor
   ...

我们将使用 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;
   }
}

下图显示脚本运行时的画面状态。

自定义字体设置按钮

自定义字体设置按钮