È possibile emettere testo su più righe in un oggetto OBJ_TEXT? - pagina 3

 
Alexey Viktorov:
Nikolay, è possibile allineare il testo nell'angolo in alto a destra. Ho lottato per mezza giornata... L'ho allineato all'angolo destro, ma il testo è allineato solo a sinistra. Puoi darmi un suggerimento?
Conosco almeno due modi.
Alexei, te lo mostro appena arrivo al computer, se non puoi farlo prima.
Lo vuoi sulla tela o sugli oggetti?
 
Nikolai Semko:
Conosco almeno due modi.

impostare il parametro dell'ancora in TextOut (e probabilmente anche l'oggetto stesso)

calcolare la dimensione del testo e tenerne conto )

 
Andrei Trukhanovich:

impostare il parametro dell'ancora in TextOut (e probabilmente anche l'oggetto stesso)

calcolare la dimensione del testo e tenerne conto )

a destra
 
Alexey Viktorov:
Nikolai, è possibile allineare il testo nell'angolo in alto a destra. Ho lottato per mezza giornata... L'angolo destro è allineato, ma il testo è allineato solo a sinistra. Puoi darmi un suggerimento?
#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:
Conosco almeno due modi.
Alexei, te lo mostro appena arrivo al computer, se non puoi farlo prima.
Lo vuoi su tela o su oggetti?
Su tela, naturalmente. Dato che la domanda è diretta a te.
 
Andrei Trukhanovich:

impostare il parametro dell'ancora in TextOut (e probabilmente anche l'oggetto stesso)

calcolare la dimensione del testo e tenerne conto )

L'ho provato. Ieri ho lottato per mezza giornata. Appena cambio qualcosa il testo scompare completamente. E non riesco a trovarlo.
 
Nikolai Semko:

Non è quello che intendevo. L'angolo destro va bene. Ma se due o più linee di lunghezza diversa, sono allineate dal primo carattere della linea. E vorrei che le stringhe fossero allineate dall'ultimo carattere della stringa.

Questa è la prima riga.

Questa è la seconda linea.

E questa è la terza linea.

Nell'esempio della prima pagina, la seconda e la terza parte del codice usano il pixel shift o lo percentage shift. Ma le linee possono essere allineate solo rientrando dal bordo sinistro. Ma questo non è sempre conveniente, specialmente se la lunghezza della stringa può variare. Per esempio "somma = 10" o "somma = 1000".
 

È strano che l'argomento sia andato su Canvas. Lo faccio da tempo immemorabile:

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 - altezza del carattere.

PS esempio per l'alto a destra :)

 
Igor Zakharov:

È strano che l'argomento sia andato su Canvas. Lo faccio da tempo immemorabile:

FS - altezza del carattere.

PS esempio per l'alto a destra :)

È così che sono riuscito a farlo anch'io per anni.

 

Ecco, ho capito.

Allineiamo l'oggetto OBJ_BITMAP_LABEL dal bordo destro, possiamo farlo rientrare orizzontalmente e verticalmente, assegniamo OBJPROP_ANCHOR a ANCHOR_RIGHT_UPPER. Poi la larghezza dell'immagine è impostata quando si crea la risorsa. E questo valore dovrebbe essere messo in TextOut come secondo parametro e poi il testo sarà allineato sul lato destro della tela.