¿Es posible imprimir texto en varias líneas en un objeto OBJ_TEXT?

 

Hola a todos.

¿Es posible imprimir el texto en varias líneas en un objeto OBJ_TEXT? Si no es así, ¿por qué no se implementa esta característica, pregunta a los desarrolladores?

 
Farkhat Guzairov:

Hola a todos.

¿Es posible imprimir el texto en varias líneas en un objeto OBJ_TEXT? Si no es así, ¿por qué no se implementa esta característica, pregunta a los desarrolladores?

Que yo recuerde, no se puede, sólo a través de un bucle.

 
Evgeny Belyaev:

Que yo recuerde, no se puede, sólo a través de un ciclo.

Sobre el bucle, eso es exactamente lo que me gustaría evitar. Por qué no se podía hacer esto desde el principio, por ejemplo en Comment funciona.

 
Farkhat Guzairov:

Hola a todos.

¿Es posible imprimir texto en varias líneas en un objeto OBJ_TEXT? Si no es así, ¿por qué no implementar esta característica, pregunta para los desarrolladores?

Es más fácil usar Kanvas con mi clase de iCanvas:

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

void OnStart()
  {
    // Значения по умолчанию:
    // "Courier New"                   - начальный шрифт с размером 18 
    // Canvas.TextPosX=20;             - начальная координата X
    // Canvas.TextPosY=100;            - начальная координата Y
    // Canvas.TextColor=clrDarkOrchid; - цвет текста с прозрачностью 1.0 (полностью непрозрачный)
    // Canvas.StepTextLine = 20;       - шаг между строками
    
    Canvas.Comm("В синем небе звезды блещут,");
    Canvas.Comm("В синем море волны хлещут;");
    Canvas.Comm("Туча по небу идет,");
    Canvas.Comm("Бочка по морю плывет.");
    
    Canvas.TextPosition(100,500);                       // Позиция X и Y. Если целое число то значение в пикселях. Если double, то в процентах от ширины и высоты
    Canvas.CurentFont("Arial",25,30,clrRed,0.7);        // 25 - размер, 30 - расстояние между строками, 0.7 - прозрачность
    Canvas.Comm("Словно горькая вдовица,");
    Canvas.Comm("Плачет, бьется в ней царица;");
    Canvas.Comm("И растет ребенок там");
    Canvas.Comm("Не по дням, а по часам.");
    
    Canvas.TextPosition(50.0,20.0);                     // Позиция X и Y в процентах от ширины и высоты (тип dounle)
    Canvas.CurentFont("Times New Roman",40,30,clrBlue); // 40 - размер, 30 - расстояние между строками, прозрачность - 1.0 (по умолчанию
    Canvas.Comm("День прошел, царица вопит...");
    Canvas.Comm("А дитя волну торопит:");
    Canvas.Comm("«Ты, волна моя, волна!");
    Canvas.Comm("Ты гульлива и вольна;");
    Canvas.TextPosY+=20;                                // увеличиваем Y координату на 20 пикселей
    Canvas.Comm("Плещешь ты, куда захочешь,");
    Canvas.TextPosX+=20;                                // увеличиваем X координату на 20 пикселей
    Canvas.Comm("Ты морские камни точишь,");
    Canvas.TextPosX+=20;                                // увеличиваем X координату на 20 пикселей
    Canvas.Comm("Топишь берег ты земли,");
    Canvas.TextPosX+=20;                                // увеличиваем X координату на 20 пикселей
    Canvas.Comm("Подымаешь корабли —");
    Canvas.StepTextLine+=30;                            // увеличиваем шаг между строками на 30 пикселей
    Canvas.Comm("Не губи ты нашу душу:");
    Canvas.Comm("Выплесни ты нас на сушу!»");
    Canvas.Update();
    Sleep(20000);  
  }


Para mostrar algo así utilizando objetos, el código sería mucho mayor.

 
Nikolai Semko:

es más fácil usar Kanvas con mi clase de iCanvas:



Para mostrar este tipo de cosas utilizando objetos, el código sería mucho mayor.

¿Es posible colocar un relleno en la parte trasera? ¿Para que el gráfico no estorbe?
 
Leon:
¿Se puede colocar un relleno en la parte trasera? ¿Para que el gráfico no estorbe?

Al principio, sólo hay que rellenar el fondo con el color y la transparencia adecuados:

Canvas.Erase(ColorToARGB(clrGreen,150)); // где 150- прозрачность, меняющаяся от 0 до 255.  0 - абсолютная прозрачность. 255-абсолютная непрозрачность
 
Nikolai Semko:

Al principio sólo hay que rellenar el fondo con el color y la transparencia adecuados:

Gracias por la solución. Pero, ¿qué pasa con el escalado? Por ejemplo, si empiezo a ampliar o reducir el gráfico por precio, ¿se superpondrá el texto?

¿O este texto será como una etiqueta?

 
Hubiera sido ideal tener un objeto de texto con soporte \N para que el problema del texto al escalar el gráfico no fuera tan grave.
 
Farkhat Guzairov:

Gracias por la solución. Pero, ¿qué pasa con el escalado? Por ejemplo, si amplío o reduzco el gráfico por precio, ¿se superpondrá el texto?

¿O este texto será como una etiqueta?

Para ello, es necesario guardar las coordenadas de inicio del texto no en píxeles, sino en precio y tiempo. Y cada vez que el evento CHARTEVENT_CHART_CHANGE debe ser redibujado usando funciones de la clase iCanvas:

double Y(double Price);
double X(datetime Time);
 
Nikolai Semko:

Al principio sólo hay que rellenar el fondo con el color y la transparencia adecuados:

¡Muchas gracias! Lo probaré uno de estos días.

 
Nikolai Semko:

Para ello, es necesario guardar las coordenadas del comienzo del texto no en píxeles, sino en precio y tiempo. Y cada vez, redibujarlos en el evento CHARTEVENT_CHART_CHANGE, utilizando funciones de la clase iCanvas:

Pues sería lo mismo que con un objeto de texto normal. De todos modos, utilizaré tu solución para otros fines, ¡gracias!