2014-10-08 60 views
2

我有一個很長的字符串(~100k字符)。我需要知道這個字符串的長度。我叫TextRenderer.MeasureText()和文本框的最大文本長度

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

但它返回寬度等於7.只有當文本長度< = 43679返回正確的值!

此外,如果我在文本框中插入文本,文本在文本框中不可見!我可以用鼠標選擇文本,通過「Ctrl + C」複製,但文本不可見。 MaxLength屬性超過文本長度。

我看過msdn,但還沒有找到任何有關在MeasureText和TextBox中使用的最大文本長度的信息。

我可以在哪裏找到關於這方面的文檔?有沒有辦法增加最大文本長度?這些值是否取決於操作系統和計算機的性能?

+0

我以前聽說過這個問題,它是一個Windows錯誤。當你做這樣的瘋狂事情時確實存在這種類型。解決方法是非常明顯的,如果字符串包含超過一千個字符,那麼你只是不在乎字符串可能有多寬,它永遠不會適合。 – 2014-10-08 09:04:21

回答

0

嘗試使用此代碼用於測量串,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); 
} 

信貸problem with TextRenderer.MeasureText

其他然後,還嘗試使用StringBuilder的長字符串,然後甚至分裂字符串成小和措施並將它們加在一起

+0

它不起作用。 graphics.MeasureCharacterRanges(文本,字體,矩形,格式)拋出「在GDI +中發生的一般錯誤。」長文本長度的例外(例如100k字符)。 – Nikolay 2014-10-08 10:20:10

0

給出了類似的例子Here。他們還解決了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; 
    } 

} 

Source

+0

我看到了這段代碼。它不能解釋爲什麼TextRenderer.MeasureText()在文本很長時不工作。 – Nikolay 2014-10-08 10:27:25

相關問題