Est-il possible d'éditer du texte sur plusieurs lignes dans un objet OBJ_TEXT ? - page 3

 
Alexey Viktorov:
Nikolay, est-il possible d'aligner le texte dans le coin supérieur droit ? J'ai lutté pendant une demi-journée... Je l'ai aligné sur le coin droit, mais le texte n'est aligné que sur le côté gauche. Pouvez-vous me donner un indice ?
Je connais au moins deux façons.
Alexei, je te montrerai dès que je serai devant l'ordinateur, si tu ne peux pas le faire avant.
Le voulez-vous sur la toile ou sur les objets ?
 
Nikolai Semko:
Je connais au moins deux façons.

définir le paramètre d'ancrage dans TextOut (et probablement l'objet lui-même aussi)

calculer la taille du texte et la prendre en compte)

 
Andrei Trukhanovich:

définir le paramètre d'ancrage dans TextOut (et probablement l'objet lui-même aussi)

calculer la taille du texte et la prendre en compte)

droite
 
Alexey Viktorov:
Nikolaï, est-il possible d'aligner le texte dans le coin supérieur droit ? J'ai lutté pendant une demi-journée... Le coin droit est aligné, mais le texte n'est aligné que sur le côté gauche. Pouvez-vous me donner un indice ?
#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:
Je connais au moins deux façons.
Alexei, je te montrerai dès que je serai devant l'ordinateur, si tu ne peux pas le faire avant.
Le voulez-vous sur une toile ou sur des objets ?
Sur la toile, bien sûr. Puisque la question s'adresse à vous.
 
Andrei Trukhanovich:

définir le paramètre d'ancrage dans TextOut (et probablement l'objet lui-même, aussi)

calculer la taille du texte et la prendre en compte)

J'ai essayé. Hier, j'ai lutté contre ce problème pendant une demi-journée. Dès que je modifie quelque chose, le texte disparaît complètement. Et je ne peux pas le trouver.
 
Nikolai Semko:

Ce n'est pas ce que je voulais dire. Le coin droit est bien. Mais si deux ou plusieurs lignes sont de longueur différente, elles sont alignées par le premier caractère de la ligne. Et je voudrais que les chaînes de caractères soient alignées par le dernier caractère de la chaîne.

C'est la première ligne.

C'est la deuxième ligne.

Et voici la troisième ligne.

Dans l'exemple de la première page, les deuxième et troisième parties du code utilisent le décalage en pixels ou le décalage en pourcentage. Mais les lignes ne peuvent être alignées que par une mise en retrait à partir du bord gauche. Mais ce n'est pas toujours pratique, surtout si la longueur de la corde peut varier. Par exemple "somme = 10" ou "somme = 1000".
 

C'est étrange que le sujet soit passé à Canvas. Je fais ça depuis des temps immémoriaux :

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 - hauteur de la police.

Exemple PS pour le haut à droite :)

 
Igor Zakharov:

C'est étrange que le sujet soit passé à Canvas. Je fais ça depuis des temps immémoriaux :

FS - hauteur de la police.

Exemple PS pour le haut à droite :)

C'est comme ça que j'ai réussi à le faire pendant des années aussi.

 

C'est bon, je l'ai.

Nous alignons l'objet OBJ_BITMAP_LABEL par le bord droit, nous pouvons l'indenter horizontalement et verticalement, nous assignons à OBJPROP_ANCHOR la valeur ANCHOR_RIGHT_UPPER. La largeur de l'image est ensuite définie lors de la création de la ressource. Cette valeur doit être placée dans TextOut en tant que second paramètre et le texte sera alors aligné sur le côté droit de la toile.