#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#define COORD_X 200
#define COORD_Y 100
#define OBJ_NAME "TestTextGetSizeBitmapLabel"
#define RES_NAME "TestTextGetSizeResource"
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion |
//+------------------------------------------------------------------+
void OnStart()
{
//--- drei Zeilen Text für die Ausgabe in das Chart vorbereiten
string text1="Dies ist die erste Textzeile";
string text2="Die zweite Zeile enthält ebenfalls Text";
string text3="Jedes Wort in jeder Zeile hat seine eigene Größe";
string text_array1[]; // Array zum Abrufen der Wörter aus Zeichenfolge 1
string text_array2[]; // Array zum Abrufen der Wörter aus Zeichenfolge 2
string text_array3[]; // Array zum Abrufen der Wörter aus Zeichenfolge 3
//--- drei Arrays mit Wörtern füllen
if(!SplitTextIntoWords(text1, text_array1) || !SplitTextIntoWords(text2, text_array2) || !SplitTextIntoWords(text3, text_array3))
return;
//--- aktuelle Chart-ID
long chart_id= ChartID();
//--- Deklaration der Parameter der grafischen Ressource
uint rc_width =(int)ChartGetInteger(chart_id, CHART_WIDTH_IN_PIXELS);
uint rc_height=(int)ChartGetInteger(chart_id, CHART_HEIGHT_IN_PIXELS);
uint rc_data[];
uint rc_size=rc_width*rc_height;
//--- Erstellen einer grafischen Ressource für die Textausgabe
if(!CreateResource(chart_id, rc_data, rc_width, rc_height))
return;
//--- Größe des Leerzeichens anhand von Breite und Höhe ermitteln
int space_w=0, space_h=0;
if(!TextGetSize(" ", space_w, space_h))
{
PrintFormat("%s: TextGetSize() failed. Error code %d",__FUNCTION__, GetLastError());
return;
}
//--- Erhöhen des vertikalen Abstands zwischen den Zeichenfolgen um 2 und zeichnen Sie die Texte aus drei Arrays in das Chart ein.
space_h+=2;
TextArrayToChart(1, text_array1, COORD_X, COORD_Y+space_h*0, space_w, rc_data, rc_width, rc_height);
TextArrayToChart(2, text_array2, COORD_X, COORD_Y+space_h*1, space_w, rc_data, rc_width, rc_height);
TextArrayToChart(3, text_array3, COORD_X, COORD_Y+space_h*2, space_w, rc_data, rc_width, rc_height);
//--- Nachdem alle Texte angezeigt wurden, aktualisieren Sie die Ressourcendaten.
Update(RES_NAME, rc_data, rc_width, rc_height, true);
//--- fünf Sekunden warten, dann die Ressource freigeben und das grafische Objekt löschen
Sleep(5000);
ResourceFree(RES_NAME);
ObjectDelete(chart_id, OBJ_NAME);
/*
Als Ergebnis der Skriptausführung werden drei Textzeichenfolgen im Chart angezeigt.
Jedes einzelne Wort in jeder Zeichenfolge wird in einem Abstand zum vorherigen Wort angezeigt,
entsprechend der Breite des Textes des vorherigen Wortes, die mit der Funktion TextGetSize(); ermittelt wurde
Das Journal enthält alle Wörter jeder Zeichenfolge mit ihren Größen:
Text array 1:
[0] word: "This", width=29, height=18
[1] word: "is", width=12, height=18
[2] word: "the", width=21, height=18
[3] word: "first", width=25, height=18
[4] word: "line", width=24, height=18
[5] word: "of", width=13, height=18
[6] word: "text", width=24, height=18
Text array 2:
[0] word: "The", width=26, height=18
[1] word: "second", width=51, height=18
[2] word: "line", width=24, height=18
[3] word: "also", width=29, height=18
[4] word: "contains", width=58, height=18
[5] word: "text", width=24, height=18
Text array 3:
[0] word: "Each", width=36, height=18
[1] word: "word", width=34, height=18
[2] word: "in", width=12, height=18
[3] word: "each", width=34, height=18
[4] word: "line", width=24, height=18
[5] word: "has", width=25, height=18
[6] word: "its", width=16, height=18
[7] word: "own", width=28, height=18
[8] word: "size", width=28, height=18
*/
}
//+----------------------------------------------------------------------------+
//| Eine Zeichenfolge anhand des "Leerzeichen" (" ") einem Wort-Array zuweisen |
//+----------------------------------------------------------------------------+
bool SplitTextIntoWords(const string text, string &array[])
{
ResetLastError();
if(StringSplit(text, StringGetCharacter(" ", 0), array)<0)
{
PrintFormat("%s: StringSplit() fehlgeschlagen. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
return(true);
}
//+------------------------------------------------------------------+
//| Text aus einem Array in einem Chart anzeigen |
//+------------------------------------------------------------------+
void TextArrayToChart(int array_num, string &array[], const int text_x, const int text_y, int space_w, uint &pixel_data[], const uint res_width, const uint res_height)
{
int width=0, height=0; // Breite und Höhe des Textes
int x=text_x; // X Koordinate des Ausgabetextes
//--- einen Header mit dem Namen des verarbeiteten Wort-Arrays ausgeben
Print("Text array ", array_num,":");
//--- in einer Schleife durch das Wort-Array
int total=(int)array.Size();
for(int i=0; i<total; i++)
{
//--- das nächste Wort abrufen und an das Chart senden (wir zeichnen es in das Ressourcen-Pixel-Array)
string word=array[i];
TextOut(word, x, text_y, ANCHOR_LEFT_UPPER, pixel_data, res_width, res_height, ColorToARGB(clrDodgerBlue), COLOR_FORMAT_ARGB_NORMALIZE);
//--- Textgröße des aktuellen Wortes abrufen
ResetLastError();
if(!TextGetSize(word, width, height))
{
PrintFormat("%s: TextGetSize(\"%s\") fehlgeschlagen. Error code %d",__FUNCTION__, word, GetLastError());
continue;
}
//--- Ausdruck der Textdaten im Journal – das Wort, seine Breite und Höhe,
//--- dann erhöhen wir die X-Koordinate des nächsten Wortes um (Wortbreite) + (Leerzeichenbreite).
PrintFormat("[%d] word: \"%s\", width=%d, height=%d",i, word, width, height);
x+=width+space_w;
}
}
//+------------------------------------------------------------------+
//| Grafische Ressource für das gesamte Chart erstellen |
//+------------------------------------------------------------------+
bool CreateResource(const long chart_id, uint &pixel_data[], const uint width, const uint height)
{
//--- Festlegen der Größe des Pixelarrays
ResetLastError();
uint size=width*height;
if(ArrayResize(pixel_data, size)!=size)
{
PrintFormat("%s: ArrayResize() fehlgeschlagen. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- Füllen des Pixelarrays mit einer transparenten Farbe und Erstellen einer grafischen Ressource auf der Grundlage dieser Farbe
ArrayInitialize(pixel_data, 0x00FFFFFF);
if(!ResourceCreate(RES_NAME, pixel_data, width, height, 0, 0, 0, COLOR_FORMAT_ARGB_NORMALIZE))
{
PrintFormat("%s: ResourceCreate() fehlgeschlagen. Error code ",__FUNCTION__, GetLastError());
return(false);
}
//--- Erstellen des Grafiklabel-Objekt an den Koordinaten der oberen linken Ecke des Charts.
if(!ObjectCreate(0, OBJ_NAME, OBJ_BITMAP_LABEL, 0, 0, 0))
{
PrintFormat("%s: ObjectCreate() fehlgeschlagen. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- die Breite und Höhe des erstellten Bitmap-Objekts auf die Breite und Höhe der grafischen Ressource einstellen.
//--- Setzen des Ankerpunkts des Objekts auf seine Mitte.
if(!ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_XSIZE, width))
{
PrintFormat("%s: ObjectSetInteger() fehlgeschlagen. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_YSIZE, height))
{
PrintFormat("%s: ObjectSetInteger() fehlgeschlagen. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- Angabe der zuvor erstellten grafischen Ressource für das Bitmap-Objekt als Bilddatei
//--- in diesem Fall müssen wir, um den Namen der verwendeten grafischen Ressource anzugeben, "::" vor ihrem Namen hinzufügen
if(!ObjectSetString(chart_id, OBJ_NAME, OBJPROP_BMPFILE, "::"+RES_NAME))
{
PrintFormat("%s: ObjectSetString() fehlgeschlagen. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- alles in Ordnung
return(true);
}
//+------------------------------------------------------------------+
//| Grafische Ressourcendaten aktualisieren |
//+------------------------------------------------------------------+
void Update(const string res_name, const uint &pixel_data[], const uint width, const uint height, const bool redraw)
{
//--- Verlassen, wenn Dimensionen von 0 übergeben wurden
if(width==0 || height==0)
return;
//--- Ressourcendaten aktualisieren und den Chart neu zeichnen
if(ResourceCreate(res_name, pixel_data, width, height, 0, 0, 0, COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
ChartRedraw();
}
|