字体设置
所有类型的对象都支持为其设置特定文本 (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(0, CHART_WIDTH_IN_BARS);
const int first = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);
const datetime centerTime = iTime(NULL, 0, first - bars / 2);
const double centerPrice =
(ChartGetDouble(0, CHART_PRICE_MIN)
+ ChartGetDouble(0, CHART_PRICE_MAX)) / 2;
const int centerX = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) / 2;
const int centerY = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS) / 2;
...
|
测试对象类型列表在types数组中指定。对于某些对象(特别是 OBJ_HLINE 和 OBJ_VLINE),字体设置将不会生效,尽管其描述文本仍会显示在屏幕上(为确保显示效果,我们启用了 CHART_SHOW_OBJECT_DESCR 模式)。
ChartSetInteger(0, CHART_SHOW_OBJECT_DESCR, true);
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 + str, types[t]);
object.set(OBJPROP_TIME, centerTime);
object.set(OBJPROP_PRICE, centerPrice);
object.set(OBJPROP_XDISTANCE, centerX);
object.set(OBJPROP_YDISTANCE, centerY);
object.set(OBJPROP_XSIZE, centerX / 3 * 2);
object.set(OBJPROP_YSIZE, centerY / 3 * 2);
...
|
接下来,我们设置文本和字体(字体大小随机选择)。
const int size = rand() * 15 / 32767 + 8;
Comment(str + " " + fonts[f] + " " + (string)size);
object.set(OBJPROP_TEXT, fonts[f] + " " + (string)size);
object.set(OBJPROP_FONT, fonts[f]);
object.set(OBJPROP_FONTSIZE, size);
...
|
为进行下一轮遍历,我们会在对象类型数组和字体名称数组中移动光标。
t = ++t % ArraySize(types);
f = ++f % ArraySize(fonts);
...
|
最后,我们更新图表,等待 1 秒,然后删除对象以创建另一个对象。
ChartRedraw();
Sleep(1000);
delete object;
}
}
|
下图显示脚本运行时的画面状态。

自定义字体设置按钮