MQL5Book/Scripts/p5/ObjectFont.mq5
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

133 lines
4.5 KiB
MQL5

//+------------------------------------------------------------------+
//| ObjectFont.mq5 |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//| |
//| The script creates and periodically updates objects with text: |
//| font name and size are modified. |
//+------------------------------------------------------------------+
#include "..\..\Include\ObjectMonitor.mqh"
#include "..\..\Include\AutoPtr.mqh"
//+------------------------------------------------------------------+
//| Helper class for object creation and setup |
//+------------------------------------------------------------------+
class ObjectBuilder: public ObjectSelector
{
protected:
const ENUM_OBJECT type;
const int window;
public:
ObjectBuilder(const string _id, const ENUM_OBJECT _type,
const long _chart = 0, const int _win = 0):
ObjectSelector(_id, _chart), type(_type), window(_win)
{
ObjectCreate(host, id, type, window, 0, 0);
}
~ObjectBuilder()
{
ObjectDelete(host, id);
}
bool isExisting() const
{
return ObjectFind(host, id) == window;
}
// changing name and chart is prohibited in the builder
virtual void name(const string _id) override = delete;
virtual void chart(const long _chart) override = delete;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
const string name = "ObjFont-";
// calculate center of current chart, both in pixels and time/price
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;
// for objects without text content (such as lines), we enable
// descriptions on chart - please note how they will use default font ever
ChartSetInteger(0, CHART_SHOW_OBJECT_DESCR, true);
// array of objects types to test
ENUM_OBJECT types[] =
{
OBJ_HLINE, // NB: font will not have an effect
OBJ_VLINE, // NB: font will not have an effect
OBJ_TEXT,
OBJ_LABEL,
OBJ_BUTTON,
OBJ_EDIT,
};
int t = 0; // type cursor
// some most popular fonts among standard Windows fonts
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; // font cursor
const int key = TerminalInfoInteger(TERMINAL_KEYSTATE_SCRLOCK);
AutoPtr<ObjectBuilder> guard;
// show objects of different types with different fonts
while(!IsStopped())
{
Sleep(1000);
if(TerminalInfoInteger(TERMINAL_KEYSTATE_SCRLOCK) != key)
{
continue;
}
// create and make common setup of new object
const string str = EnumToString(types[t]);
ObjectBuilder *object = guard = 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);
// adjust font name and size (random choice)
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);
// switch to next object type and font name
t = ++t % ArraySize(types);
f = ++f % ArraySize(fonts);
ChartRedraw();
}
Comment("");
}
//+------------------------------------------------------------------+