É possível emitir texto em várias linhas em um objeto OBJ_TEXT? - página 3

 
Alexey Viktorov:
Nikolay, é possível alinhar o texto para o canto superior direito. Estou lutando há meio dia... Eu o alinhei para o canto direito, mas o texto está alinhado apenas para o lado esquerdo. Você pode me dar uma dica?
Eu conheço pelo menos duas maneiras.
Alexei, eu lhe mostrarei assim que chegar ao computador, se você não conseguir lidar com isso antes disso.
Você o quer sobre uma tela ou sobre objetos?
 
Nikolai Semko:
Eu conheço pelo menos duas maneiras.

definir o parâmetro de ancoragem no TextOut (e provavelmente o próprio objeto também)

calcular o tamanho do texto e levá-lo em conta )

 
Andrei Trukhanovich:

definir o parâmetro de ancoragem no TextOut (e provavelmente o próprio objeto também)

calcular o tamanho do texto e levá-lo em conta )

à direita
 
Alexey Viktorov:
Nikolai, é possível alinhar o texto para o canto superior direito. Estou lutando há meio dia... O canto direito é alinhado, mas o texto só é alinhado para o lado esquerdo. Você pode me dar uma dica?
#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:
Eu conheço pelo menos duas maneiras.
Alexei, eu lhe mostrarei assim que chegar ao computador, se você não puder fazê-lo antes disso.
Você o quer sobre tela ou sobre objetos?
Em lona, é claro. Uma vez que a pergunta é dirigida a você.
 
Andrei Trukhanovich:

definir o parâmetro de ancoragem no TextOut (e provavelmente o próprio objeto também)

calcular o tamanho do texto e levá-lo em conta )

Eu tentei. Ontem eu estava me debatendo com ele por meio dia. Assim que eu altero algo, o texto desaparece completamente. E eu não consigo encontrá-lo.
 
Nikolai Semko:

Não era isso que eu queria dizer. O canto direito está bem. Mas se duas ou mais linhas de comprimento diferente, elas são alinhadas pelo primeiro caracter da linha. E eu gostaria que as cordas fossem alinhadas pelo último caractere da corda.

Esta é a primeira linha.

Esta é a segunda linha.

E esta é a terceira linha.

No exemplo da primeira página, a segunda e terceira partes do código utilizam o deslocamento de pixels ou deslocamento percentual. Mas as linhas só podem ser alinhadas através de recuo a partir da borda esquerda. Mas isto nem sempre é conveniente, especialmente se o comprimento da corda pode variar. Por exemplo "soma = 10" ou "soma = 1000".
 

É estranho que o tema tenha ido para a Tela. Eu faço isso desde tempos imemoriais:

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 da fonte.

Exemplo de PS para canto superior direito :)

 
Igor Zakharov:

É estranho que o tema tenha ido para a Tela. Eu faço isto desde tempos imemoriais:

FS - altura da fonte.

Exemplo de PS para canto superior direito :)

É assim que tenho sido capaz de fazer durante anos também.

 

É isso aí, já sei.

Alinhamos oobjeto OBJ_BITMAP_LABEL pela borda direita, podemos recuá-lo horizontal e verticalmente, atribuímos OBJPROP_ANCHOR a ANCHOR_RIGHT_UPPER. Então, a largura da imagem é definida ao criar o recurso. E este valor deve ser colocado no TextOut como segundo parâmetro e então o texto será alinhado no lado direito da tela.