Есть ли возможность в объекте OBJ_TEXT выводить текст в несколько строк? - страница 3

 
Alexey Viktorov:
Николай, есть возможность выровнять текст в правый верхний угол. Пол-дня бьюсь... В правый угол вывел, но текст выравнивается только к левой стороне. Можете подсказать?
Как минимум два способа знаю.
Алексей, как доберусь до компа, покажу, если раньше не справитесь.
На канвасе нужно или на объектах?
 
Nikolai Semko:
Как минимум два способа знаю.

задать параметр anchor в TextOut (и у самого объекта наверное тоже надо)

посчитать размер текста и учитывать его )

 
Andrei Trukhanovich:

задать параметр anchor в TextOut (и у самого объекта наверное тоже надо)

посчитать размер текста и учитывать его )

правильно
 
Alexey Viktorov:
Николай, есть возможность выровнять текст в правый верхний угол. Пол-дня бьюсь... В правый угол вывел, но текст выравнивается только к левой стороне. Можете подсказать?
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

int OnInit()
  {
   RightTopText("Текст в правом верхнем углу","Tahoma",25);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE) RightTopText("Текст в правом верхнем углу","Tahoma",25);
  }
//+------------------------------------------------------------------+
void RightTopText(string str,string name,int size)
  {
   Canvas.Erase();
   Canvas.FontSet(name,size);
   Canvas.TextPosition(W.Width-Canvas.TextWidth(str)-5,0);
   Canvas.Comm(str);
   Canvas.Update();
  }
//+------------------------------------------------------------------+
 
Nikolai Semko:
Как минимум два способа знаю.
Алексей, как доберусь до компа, покажу, если раньше не справитесь.
На канвасе нужно или на объектах?
Конечно на канвасе. Поскольку вопрос именно к Вам.
 
Andrei Trukhanovich:

задать параметр anchor в TextOut (и у самого объекта наверное тоже надо)

посчитать размер текста и учитывать его )

Это я пробовал. С этим и бился вчера пол-дня. Как только что-то меняю исчезает текст совсем. И найти не могу.
 
Nikolai Semko:

Я не это имел ввиду. В правый угол поместить получилось. Но если две или более строки разной длины, они выравниваются по первому символу строки. А хотелось-бы чтобы строки были выровнены по последнему символу строки.

Это первая строка.

Вторая строка.

А это третья строка.

Вот в примере на первой странице, вторая и третья часть кода использует сдвиг в пикселях или в процентах. Но строки подравнять можно только отступом от левого края. Но это не всегда удобно, особенно если длина строки может меняться. Например "сумма = 10" или "сумма = 1000".
 

Странно, что тема в Канвасы ушла. Вот так делаю с незапамятных времён:

string obj_pref="A_EA_";
void Text(int i,string text="",color CLR=clrBlue)
{
   string name=obj_pref+IntegerToString(i);
   if(ObjectCreate(0,name,OBJ_LABEL,0,0,0))
    {
     ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
     ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
     ObjectSetInteger(0,name,OBJPROP_XDISTANCE,5);
     ObjectSetInteger(0,name,OBJPROP_YDISTANCE,int(i*FS*1.4));
     ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FS);
     ObjectSetString (0,name,OBJPROP_FONT,"Arial");
    }
    ObjectSetString (0,name,OBJPROP_TEXT,text);
    ObjectSetInteger(0,name,OBJPROP_COLOR,CLR);
}

FS - высота шрифта.

PS пример для верхнего правого :)

 
Igor Zakharov:

Странно, что тема в Канвасы ушла. Вот так делаю с незапамятных времён:

FS - высота шрифта.

PS пример для верхнего правого :)

Так я тоже умею уже много лет.

 

Всё, разобрался.

Объект OBJ_BITMAP_LABEL выравниваем по правому краю, можно с каким-то отступом по горизонтали и вертикали, OBJPROP_ANCHOR назначаем ANCHOR_RIGHT_UPPER. Затем при создании ресурса задаётся ширина изображения. И вот это значение надо поставить в TextOut вторым параметром и тогда текст будет выровнен по правому краю "холста".

Причина обращения: