C# TextRenderer.MeasureText()和textbox最大文本长度

C# TextRenderer.MeasureText()和textbox最大文本长度,c#,.net,textbox,textrenderer,C#,.net,Textbox,Textrenderer,我有一个长字符串(~100k个字符)。我需要知道这根绳子的长度。我打电话 Size s = TextRenderer.MeasureText(graphics, text, font); 但它返回的宽度等于7。仅当文本长度尝试使用此代码测量字符串时,textrenderer才不准确 protected int _MeasureDisplayStringWidth ( Graphics graphics, string text, Font font ) { if ( text == "

我有一个长字符串(~100k个字符)。我需要知道这根绳子的长度。我打电话

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

但它返回的宽度等于7。仅当文本长度尝试使用此代码测量字符串时,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 );
}
归功于

除此之外,还可以尝试将stringbuilder与长字符串一起使用,然后甚至将字符串拆分为较小的字符串,测量这些字符串并将其添加到一起。此外,他们还解决了上的maxLength问题

要点:请参阅本文中如何使用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;
    }

}
private静态无效DrawALineOfText(PaintEventArgs e)
{
//声明要在窗体上呈现的字符串。
string[]stringsToPaint={“Tail”、“Spin”、“Toys”};
//声明用于呈现字符串的字体。
字体[]字体={新字体(“Arial”,14,FontStyle.Regular),
新字体(“Arial”,14,FontStyle.Italic),
新字体(“Arial”,14,FontStyle.Regular)};
点开始点=新点(10,10);
//将TextFormatFlags设置为无填充,以便将字符串绘制在一起。
TextFormatFlags flags=TextFormatFlags.noppadding;
//声明建议的大小,并将维度设置为最大整数值。
尺寸建议尺寸=新尺寸(int.MaxValue,int.MaxValue);
//测量每个字符串的字体和大小,并添加值和
//把它画到表格上。
对于(int i=0;i

我以前听说过这个问题,它是一个Windows错误。当你做这种疯狂的事情时,这种情况确实存在。解决方法很明显,如果字符串包含超过1000个字符,那么您就不再关心字符串的宽度,它永远不会适合。它不起作用。graphics.MeasureCharacterRanges(文本、字体、矩形、格式)抛出“GDI+中发生一般错误”。长文本长度(例如100k个字符)异常。我的测试:MeasureCharacterRanges的最大长度只有32个字符。我看到了这段代码。它没有解释文本长时TextRenderer.MeasureText()不工作的原因。