在一个OBJ_TEXT对象中,是否可以在多行上输出文本? - 页 3

 
Alexey Viktorov:
尼古拉,是否可以将文字对齐到右上角。我已经挣扎了半天了...我已经把它对准了右角,但文字只对准了左边。你能给我一个提示吗?
我知道至少有两种方法。
阿列克谢,我一到电脑前就给你看,如果你在那之前做不到的话。
你想让它在画布上还是在物体上?
 
Nikolai Semko:
我知道至少有两种方法。

在TextOut中设置锚点参数(可能也包括对象本身)。

计算文本大小并将其考虑在内 )

 
Andrei Trukhanovich:

在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:

在TextOut中设置锚点参数(可能也包括对象本身)。

计算文字大小并将其考虑在内 )

我试过了。昨天,我为它纠结了半天。一旦我改变了什么,文本就会完全消失。而我却找不到它。
 
Nikolai Semko:

我不是这个意思。右手边的角落很好。但如果两行或多行的长度不同,则按该行的第一个字符对齐。我想让字符串以字符串的最后一个字符为单位对齐。

这是第一行。

这是第二行。

而这是第三行。

在第一页的例子中,代码的第二和第三部分使用了像素移动或百分比移动。但这些线条只能通过从左边缘缩进来对齐。但这并不总是很方便,特别是当绳子的长度 可以变化时。例如,"sum = 10 "或 "sum = 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中,然后文本将在画布的右边对齐。