#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"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- grafiğe çıktı olarak üç satır metin hazırla
string text1="This is the first line of text";
string text2="The second line also contains text";
string text3="Each word in each line has its own size";
string text_array1[]; // 1. dizgeden kelime kümesini almak için dizi
string text_array2[]; // 2. dizgeden kelime kümesini almak için dizi
string text_array3[]; // 3. dizgeden kelime kümesini almak için dizi
//--- üç kelime dizisini doldur
if(!SplitTextIntoWords(text1, text_array1) || !SplitTextIntoWords(text2, text_array2) || !SplitTextIntoWords(text3, text_array3))
return;
//--- mevcut grafik kimliği
long chart_id= ChartID();
//--- grafiksel kaynağın parametrelerini bildir
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;
//--- metin çıktısı için bir grafiksel kaynak oluştur
if(!CreateResource(chart_id, rc_data, rc_width, rc_height))
return;
//--- boşluk karakterinin boyutunu genişlik ve yüksekliğe göre al
int space_w=0, space_h=0;
if(!TextGetSize(" ", space_w, space_h))
{
PrintFormat("%s: TextGetSize() failed. Error code %d",__FUNCTION__, GetLastError());
return;
}
//--- dizgeler arasındaki dikey girintiyi 2 artır ve üç dizideki metinleri grafik üzerinde çiz
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);
//--- tüm metinler görüntülendikten sonra kaynak verileri güncelle
Update(RES_NAME, rc_data, rc_width, rc_height, true);
//--- beş saniye bekle, ardından kaynağı serbest bırak ve grafiksel nesneyi sil
Sleep(5000);
ResourceFree(RES_NAME);
ObjectDelete(chart_id, OBJ_NAME);
/*
komut dosyasının yürütülmesi sonucunda grafik üzerinde üç metin dizgesi görüntülenir
her bir dizgedeki her bir kelime bir önceki kelimeden belirli bir uzaklıkta görüntülenir
(bu uzaklık, TextGetSize() fonksiyonu kullanılarak elde edilen bir önceki kelimenin metninin genişliğine eşittir)
günlük, her dizgenin tüm kelimelerini boyutlarıyla birlikte içerecektir:
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
*/
}
//+----------------------------------------------------------------------------+
//| Boşluk ayırıcısını (“ ”) kullanarak bir dizgeyi kelime dizisine böl |
//+----------------------------------------------------------------------------+
bool SplitTextIntoWords(const string text, string &array[])
{
ResetLastError();
if(StringSplit(text, StringGetCharacter(" ", 0), array)<0)
{
PrintFormat("%s: StringSplit() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
return(true);
}
//+------------------------------------------------------------------+
//| Grafik üzerinde bir dizideki metni görüntüle |
//+------------------------------------------------------------------+
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; // metin genişliği ve yüksekliği
int x=text_x; // çıktı metninin X koordinatı
//--- işlenen kelime dizisinin adını içeren bir başlık yazdır
Print("Text array ", array_num,":");
//--- kelime dizisine göre bir döngü içinde
int total=(int)array.Size();
for(int i=0; i<total; i++)
{
//--- sonraki kelimeyi al ve grafiğe gönder (kaynak piksel dizisine çizeriz)
string word=array[i];
TextOut(word, x, text_y, ANCHOR_LEFT_UPPER, pixel_data, res_width, res_height, ColorToARGB(clrDodgerBlue), COLOR_FORMAT_ARGB_NORMALIZE);
//--- mevcut kelimenin metin boyutunu al
ResetLastError();
if(!TextGetSize(word, width, height))
{
PrintFormat("%s: TextGetSize(\"%s\") failed. Error code %d",__FUNCTION__, word, GetLastError());
continue;
}
//--- metin verilerini günlüğe yazdır - kelime, genişliği ve yüksekliği,
//--- ardından bir sonraki kelimenin X koordinatını (kelime genişliği) + (boşluk genişliği) kadar artır
PrintFormat("[%d] word: \"%s\", width=%d, height=%d",i, word, width, height);
x+=width+space_w;
}
}
//+------------------------------------------------------------------+
//| Grafiğin tamamı için bir grafiksel kaynak oluştur |
//+------------------------------------------------------------------+
bool CreateResource(const long chart_id, uint &pixel_data[], const uint width, const uint height)
{
//--- piksel dizisinin büyüklüğünü ayarla
ResetLastError();
uint size=width*height;
if(ArrayResize(pixel_data, size)!=size)
{
PrintFormat("%s: ArrayResize() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- piksel dizisini saydam renkle doldur ve buna dayalı bir grafiksel kaynak oluştur
ArrayInitialize(pixel_data, 0x00FFFFFF);
if(!ResourceCreate(RES_NAME, pixel_data, width, height, 0, 0, 0, COLOR_FORMAT_ARGB_NORMALIZE))
{
PrintFormat("%s: ResourceCreate() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- grafiğin sol üst köşesinin koordinatlarında bir "bitmap etiket" nesnesi oluştur
if(!ObjectCreate(0, OBJ_NAME, OBJ_BITMAP_LABEL, 0, 0, 0))
{
PrintFormat("%s: ObjectCreate() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- oluşturulan bitmap nesnesinin genişlik ve yüksekliğini grafiksel kaynağın genişlik ve yüksekliğine eşit olarak ayarla.
//--- nesne çapa noktasını merkezine ayarla.
if(!ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_XSIZE, width))
{
PrintFormat("%s: ObjectSetInteger() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_YSIZE, height))
{
PrintFormat("%s: ObjectSetInteger() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- bitmap nesnesi için önceden oluşturulmuş grafiksel kaynağı bir görüntü dosyası olarak belirt
//--- bu durumda, kullanılan grafiksel kaynağın adını belirtmek için adının önüne “::” eklememiz gerekir
if(!ObjectSetString(chart_id, OBJ_NAME, OBJPROP_BMPFILE, "::"+RES_NAME))
{
PrintFormat("%s: ObjectSetString() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- her şey yolunda
return(true);
}
//+------------------------------------------------------------------+
//| Grafiksel kaynak verilerini güncelle |
//+------------------------------------------------------------------+
void Update(const string res_name, const uint &pixel_data[], const uint width, const uint height, const bool redraw)
{
//--- sıfır boyut iletilirse ayrıl
if(width==0 || height==0)
return;
//--- kaynak verilerini güncelle ve grafiği yeniden çiz
if(ResourceCreate(res_name, pixel_data, width, height, 0, 0, 0, COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
ChartRedraw();
}
|