OBJ_TEXTオブジェクトでテキストを複数行に出力することは可能ですか? - ページ 3

 
Alexey Viktorov:
Nikolay、テキストを右上に揃えることは可能ですか?半日も悩んでしまった...。右隅に揃えたのですが、文字が左側にしか揃いません。ヒントを教えてください。
少なくとも2つの方法を知っています。
アレクセイ、コンピュータを手に入れたらすぐに見せるから、それまでに処理できないなら
キャンバスに描くのか、オブジェクトに描くのか?
 
Nikolai Semko:
少なくとも2つの方法を知っています。

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:
少なくとも2つの方法を知っています。
アレクセイ、コンピュータを手に入れたらすぐに見せるから、それまでに処理できないなら
キャンバスに描くか、オブジェに描くか?
もちろん、キャンバスに。質問があなたに向けられているので。
 
Andrei Trukhanovich:

TextOutにアンカーパラメータを設定する(おそらくオブジェクト自体にも設定する)

テキストサイズを計算し、それを考慮する )

試してみました。昨日は半日ほど悩んでいました。何かを変更すると、すぐにテキストが完全に消えてしまいます。そして、見つからないのです。
 
Nikolai Semko:

そういう意味じゃないんです。右側は問題ありません。ただし、長さの異なる2行以上の場合は、その行の最初の文字で整列されます。そして、文字列は、文字列の最後の文字で整列させたい。

これが1行目です。

これが2行目です。

そして、これが3行目です。

1ページ目の例では、コードの2番目と3番目の部分でピクセルシフトとパーセントシフトを使用しています。しかし、行は左端からインデントすることでしか揃えることができません。しかし、特に文字列の長 さにばらつきがある場合、これは必ずしも便利ではありません。例えば、"sum = 10 "や "sum = 1000 "のように。
 

話題がCANVASに行ったのは不思議な感じです。太古の昔からやっていることです。

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:

話題がCANVASに行ったのが不思議なくらいです。太古の昔からやっていることです。

FS - フォントの高さ。

右上のPSの例 :)

私もそれで何年もやってこれたんです。

 

それだ、わかったぞ。

OBJ_BITMAP_LABELオブジェクトを 右端に揃え、水平方向と垂直方向にインデントし、OBJPROP_ANCHORをANCHOR_RIGHT_UPPERに代入しています。そして、リソースの作成時に画像の幅を設定する。この値を第2パラメータとしてTextOutに入れると、テキストがキャンバスの右側に整列されます。