TextRenderer.MeasureText () и максимальная длина текста текстового поля

У меня длинная строка (~ 100 тыс. Символов). Мне нужно знать длину этой строки. Я звоню

Size s = TextRenderer.MeasureText(graphics, text, font);

Но он возвращает ширину равную 7. Только если длина текста ‹= 43679, он возвращает правильное значение!

Кроме того, если я вставлю текст в текстовое поле, текст не будет виден в текстовом поле! Я могу выделить текст мышью, скопировать с помощью «Ctrl + C», но текст не виден. MaxLength больше длины текста.

Я просмотрел msdn, но не нашел никакой информации о максимальной длине текста, который используется в MeasureText и TextBox.

Где я могу найти документацию по этому поводу? Есть ли способ увеличить максимальную длину текста? Эти значения зависят от операционной системы и производительности компьютера?


person Nikolay    schedule 08.10.2014    source источник
comment
Я слышал об этой проблеме раньше, это ошибка Windows. Такие есть, когда ты делаешь такие безумные вещи. Обходной путь довольно очевиден: если строка содержит более тысячи символов, вам больше не важно, насколько широкой может быть строка, она никогда не подойдет.   -  person Hans Passant    schedule 08.10.2014


Ответы (2)


Попробуйте использовать этот код для измерения строк, textrenderer не точен

protected int _MeasureDisplayStringWidth ( Graphics graphics, string text, Font font )
{
    if ( text == "" )
        return 0;

    StringFormat format = new StringFormat ( StringFormat.GenericDefault );
    RectangleF rect = new RectangleF ( 0, 0, 1000, 1000 );
    CharacterRange[] ranges = { new CharacterRange ( 0, text.Length ) };
    Region[] regions = new Region[1];

    format.SetMeasurableCharacterRanges ( ranges );
    format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;

    regions = graphics.MeasureCharacterRanges ( text, font, rect, format );
    rect = regions[0].GetBounds ( graphics );

    return (int)( rect.Right );
}

кредит на проблему с TextRenderer.MeasureText

Кроме того, попробуйте использовать конструктор строк с длинными строками, а затем даже разделите строки на более мелкие, измерьте их и сложите вместе.

person Vajura    schedule 08.10.2014
comment
Это не работает. graphics.MeasureCharacterRanges (текст, шрифт, прямоугольник, формат) throw Общая ошибка произошла в GDI +. исключение с длинной длиной текста (например, 100 тыс. символов). - person Nikolay; 08.10.2014
comment
мои тесты: максимальная длина для MeasureCharacterRanges составляет всего 32 символа. - person Ishma; 23.08.2018

Аналогичный пример был приведен здесь. Также они рассмотрели проблему maxLength на msdn

Важно: посмотрите, как используется MaxLength в статье.

private static void DrawALineOfText(PaintEventArgs e)
{
    // Declare strings to render on the form. 
    string[] stringsToPaint = { "Tail", "Spin", " Toys" };

    // Declare fonts for rendering the strings.
    Font[] fonts = { new Font("Arial", 14, FontStyle.Regular), 
        new Font("Arial", 14, FontStyle.Italic), 
        new Font("Arial", 14, FontStyle.Regular) };

    Point startPoint = new Point(10, 10);

    // Set TextFormatFlags to no padding so strings are drawn together.
    TextFormatFlags flags = TextFormatFlags.NoPadding;

    // Declare a proposed size with dimensions set to the maximum integer value.
    Size proposedSize = new Size(int.MaxValue, int.MaxValue);

    // Measure each string with its font and NoPadding value and  
    // draw it to the form. 
    for (int i = 0; i < stringsToPaint.Length; i++)
    {
        Size size = TextRenderer.MeasureText(e.Graphics, stringsToPaint[i], 
            fonts[i], proposedSize, flags);
        Rectangle rect = new Rectangle(startPoint, size);
        TextRenderer.DrawText(e.Graphics, stringsToPaint[i], fonts[i],
            startPoint, Color.Black, flags);
        startPoint.X += size.Width;
    }

}

Источник

person Nuru Salihu    schedule 08.10.2014
comment
Я видел этот код. Это не объясняет, почему TextRenderer.MeasureText () не работает, когда текст длинный. - person Nikolay; 08.10.2014