¿Es posible imprimir texto en varias líneas en un objeto OBJ_TEXT? - página 3

 
Alexey Viktorov:
Nikolay, ¿es posible alinear el texto en la esquina superior derecha? He estado luchando durante medio día... Lo he alineado a la esquina derecha, pero el texto está alineado sólo a la izquierda. ¿Puedes darme una pista?
Conozco al menos dos formas.
Alexei, te lo enseñaré en cuanto llegue al ordenador, si no puedes con ello antes.
¿Lo quieres en un lienzo o en objetos?
 
Nikolai Semko:
Conozco al menos dos formas.

establecer el parámetro de anclaje en TextOut (y probablemente también en el propio objeto)

calcular el tamaño del texto y tenerlo en cuenta )

 
Andrei Trukhanovich:

establecer el parámetro de anclaje en TextOut (y probablemente también en el propio objeto)

calcular el tamaño del texto y tenerlo en cuenta )

a la derecha
 
Alexey Viktorov:
Nikolai, ¿es posible alinear el texto en la esquina superior derecha? He estado luchando durante medio día... La esquina derecha está alineada, pero el texto sólo está alineado a la izquierda. ¿Puedes darme una pista?
#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:
Conozco al menos dos formas.
Alexei, te lo enseñaré en cuanto llegue al ordenador, si no puedes hacerlo antes.
¿Lo quiere sobre lienzo o sobre objetos?
En un lienzo, por supuesto. Ya que la pregunta va dirigida a usted.
 
Andrei Trukhanovich:

establecer el parámetro de anclaje en TextOut (y probablemente también en el propio objeto)

calcular el tamaño del texto y tenerlo en cuenta )

Lo he probado. Ayer estuve luchando con ello durante medio día. En cuanto cambio algo, el texto desaparece por completo. Y no puedo encontrarlo.
 
Nikolai Semko:

No es eso lo que quería decir. La esquina derecha está bien. Pero si hay dos o más líneas de diferente longitud, se alinean por el primer carácter de la línea. Y me gustaría que las cadenas se alinearan por el último carácter de la cadena.

Esta es la primera línea.

Esta es la segunda línea.

Y esta es la tercera línea.

En el ejemplo de la primera página, la segunda y la tercera parte del código utilizan el desplazamiento de píxeles o el desplazamiento porcentual. Pero las líneas sólo se pueden alinear haciendo una sangría desde el borde izquierdo. Pero esto no siempre es conveniente, especialmente si la longitud de la cuerda puede variar. Por ejemplo, "suma = 10" o "suma = 1000".
 

Es extraño que el tema se haya ido a Canvas. Llevo haciendo esto desde tiempos inmemoriales:

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 - altura de la fuente.

PS ejemplo para la parte superior derecha :)

 
Igor Zakharov:

Es extraño que el tema haya pasado a Canvas. Llevo haciendo esto desde tiempos inmemoriales:

FS - altura de la fuente.

PS ejemplo para la parte superior derecha :)

Así es como yo también he podido hacerlo durante años.

 

Eso es, lo tengo.

Alineamos elobjeto OBJ_BITMAP_LABEL por el borde derecho, podemos hacer una sangría horizontal y vertical, asignamos OBJPROP_ANCHOR a ANCHOR_RIGHT_UPPER. Entonces, el ancho de la imagen se establece al crear el recurso. Y este valor debe ser puesto en TextOut como segundo parámetro y entonces el texto será alineado en el lado derecho del lienzo.