TextGetSize

Возвращает ширину и высоту строки при текущих настройках шрифта.

bool  TextGetSize(
   const string       text,          // строка текста
   uint&               width,        // ширина буфера в точках
   uint&               height        // высота буфера в точках
   );

Параметры

text

[in]  Строка для которой получаем длину и ширину.

width

[out]  Входной параметр для получения ширины.

height

[out]  Входной параметр для получения высоты.

Возвращаемое значение

Возвращает true в случае успешного выполнения, иначе false. Возможные коды ошибок:

  • ERR_INTERNAL_ERROR(4001) - в случае ошибки операционной системы.

 

Пример:

#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()
  {
//--- подготовим три строки текста для вывода на график
   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
   string text_array2[];   // массив для получения набора слов из строки 2
   string text_array3[];   // массив для получения набора слов из строки 2
   
//--- заполняем три массива слов
   if(!SplitTextIntoWords(text1text_array1) || !SplitTextIntoWords(text2text_array2) || !SplitTextIntoWords(text3text_array3))
      return;
      
//--- идентификатор текущего графика
   long   chart_idChartID();
   
//--- объявляем параметры графического ресурса 
   uint   rc_width =(int)ChartGetInteger(chart_idCHART_WIDTH_IN_PIXELS); 
   uint   rc_height=(int)ChartGetInteger(chart_idCHART_HEIGHT_IN_PIXELS); 
   uint   rc_data[]; 
   uint   rc_size=rc_width*rc_height;
  
//--- создаём графический ресурс для вывода текста
   if(!CreateResource(chart_idrc_datarc_widthrc_height))
      return;
   
//--- получим размер по ширине и высоте символа "пробел"
   int space_w=0space_h=0;
   if(!TextGetSize(" "space_wspace_h))
     {
      PrintFormat("%s: TextGetSize() failed. Error code %d",__FUNCTION__GetLastError()); 
      return
     }
   
//--- увеличим вертикальный отступ между строками на 2 и выведем на график тексты из трёх массивов
   space_h+=2;
   TextArrayToChart(1text_array1COORD_XCOORD_Y+space_h*0space_wrc_datarc_widthrc_height);
   TextArrayToChart(2text_array2COORD_XCOORD_Y+space_h*1space_wrc_datarc_widthrc_height);
   TextArrayToChart(3text_array3COORD_XCOORD_Y+space_h*2space_wrc_datarc_widthrc_height);
   
//--- после вывода всех текстов обновим ресурсные данные
   Update(RES_NAMErc_datarc_widthrc_heighttrue);
   
//--- подождём пять секунд, затем освободим ресурс и удалим графический объект
   Sleep(5000);
   ResourceFree(RES_NAME);
   ObjectDelete(chart_idOBJ_NAME);
   /*
   в результате работы скрипта на график будут выведены три строки текста
   каждое отдельное слово в каждой строке выводится на дистанции от предыдущего слова,
   равной ширине текста предыдущего слова, получаемой при помощи функции TextGetSize();
   в журнале будут распечатаны все слова каждой строки с их размерами:
   Text array 1:
   [0word"This"width=29height=18
   [1word"is"width=12height=18
   [2word"the"width=21height=18
   [3word"first"width=25height=18
   [4word"line"width=24height=18
   [5word"of"width=13height=18
   [6word"text"width=24height=18
   Text array 2:
   [0word"The"width=26height=18
   [1word"second"width=51height=18
   [2word"line"width=24height=18
   [3word"also"width=29height=18
   [4word"contains"width=58height=18
   [5word"text"width=24height=18
   Text array 3:
   [0word"Each"width=36height=18
   [1word"word"width=34height=18
   [2word"in"width=12height=18
   [3word"each"width=34height=18
   [4word"line"width=24height=18
   [5word"has"width=25height=18
   [6word"its"width=16height=18
   [7word"own"width=28height=18
   [8word"size"width=28height=18
   */ 
  }
//+------------------------------------------------------------------+
//| Разбивает строку на массив слов по разделителю "пробел" (" ")    |
//+------------------------------------------------------------------+
bool SplitTextIntoWords(const string textstring &array[])
  {
   ResetLastError();
   if(StringSplit(textStringGetCharacter(" "0), array)<0)
     {
      PrintFormat("%s: StringSplit() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Выводит текст из массива на график                               |
//+------------------------------------------------------------------+
void TextArrayToChart(int array_numstring &array[], const int text_xconst int text_yint space_wuint &pixel_data[], const uint res_widthconst uint res_height)
  {
   int width=0height=0;  // ширина и высота текста
   int x=text_x;           // координата X выводимого текста
   
//--- распечатаем заголовок с названием обрабатываемого массива слов
   Print("Text array "array_num,":");
   
//--- в цикле по массиву слов
   int total=(int)array.Size();
   for(int i=0i<totali++)
     {
      //--- получаем очередное слово и отправляем его на график (рисуем в массиве пикселей ресурса)
      string word=array[i];
      TextOut(wordxtext_yANCHOR_LEFT_UPPERpixel_datares_widthres_heightColorToARGB(clrDodgerBlue), COLOR_FORMAT_ARGB_NORMALIZE);
      
      //--- получаем размер текста текущего слова
      ResetLastError();
      if(!TextGetSize(wordwidthheight))
        {
         PrintFormat("%s: TextGetSize(\"%s\") failed. Error code %d",__FUNCTION__wordGetLastError()); 
         continue
        }
      //--- распечатываем в журнале данные текста - слово, его ширина и высота,
      //--- затем увеличиваем координату X следующего слова на величину (ширина слова) + (ширина пробела)
      PrintFormat("[%d] word: \"%s\", width=%d, height=%d",iwordwidthheight);
      x+=width+space_w;
     }
  }
//+------------------------------------------------------------------+
//| Создаёт графический ресурс на весь график                        |
//+------------------------------------------------------------------+
bool CreateResource(const long chart_iduint &pixel_data[], const uint widthconst uint height)
  {
//--- устанавливаем размер массива пикселей 
   ResetLastError(); 
   uint size=width*height;
   if(ArrayResize(pixel_datasize)!=size
     { 
      PrintFormat("%s: ArrayResize() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     } 
//--- заполняем массив пикселей прозрачным цветом и на его основе создаём графический ресурс 
   ArrayInitialize(pixel_data0x00FFFFFF); 
   if(!ResourceCreate(RES_NAMEpixel_datawidthheight000COLOR_FORMAT_ARGB_NORMALIZE)) 
     { 
      PrintFormat("%s: ResourceCreate() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     } 
  
//--- создаём объект "Графическая метка" на координатах верхнего левого угла графика
   if(!ObjectCreate(0OBJ_NAMEOBJ_BITMAP_LABEL000)) 
     { 
      PrintFormat("%s: ObjectCreate() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     } 
//--- устанавливаем созданному объекту-рисунку ширину и высоту, равные ширине и высоте графического ресурса. 
//--- устанавливаем точку привязки объекта по его центру. 
   if(!ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_XSIZEwidth))
     {
      PrintFormat("%s: ObjectSetInteger() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     }
   if(!ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_YSIZEheight))
     {
      PrintFormat("%s: ObjectSetInteger() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     }
//--- указываем для объекта-рисунка в качестве файла изображения ранее созданный графический ресурс 
//--- в этом случае для указания имени используемого графического ресурса нужно перед его именем дописать "::" 
   if(!ObjectSetString(chart_idOBJ_NAMEOBJPROP_BMPFILE"::"+RES_NAME))
     {
      PrintFormat("%s: ObjectSetString() failed. Error code %d",__FUNCTION__GetLastError()); 
      return(false); 
     }
    
//--- всё успешно
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Обновляет данные графического ресурса                            | 
//+------------------------------------------------------------------+ 
void Update(const string res_nameconst uint &pixel_data[], const uint widthconst uint heightconst bool redraw
  { 
//--- если переданы нулевые размеры - уходим 
   if(width==0 || height==0
      return
//--- обновляем ресурсные данные и перерисовываем график 
   if(ResourceCreate(res_namepixel_datawidthheight000COLOR_FORMAT_ARGB_NORMALIZE) && redraw
      ChartRedraw(); 
  } 

Смотри также

Ресурсы, ResourceCreate(), ResourceSave(), TextSetFont(), TextOut()