2008-11-10 36 views

回答

1

可能的提示:也許某種二進制搜索使用Graphics.MeasureString()?

0

編輯:沒有意識到你想嘗試和適合固定數量的行文本。這是一個艱難的嘗試和解決。這是我能想出,可能不是最優雅的最好的,但它似乎工作:

public SizeF CalculateWidth(Font font, Graphics graphics, int numOfLines, 
          string text) 
{ 
    SizeF sizeFull = graphics.MeasureString(text, font, 
              new SizeF(
               float.PositiveInfinity, 
               float.PositiveInfinity), 
              StringFormat. 
               GenericTypographic); 

    float width = sizeFull.Width/numOfLines; 
    float averageWidth = sizeFull.Width/text.Length; 
    int charsFitted; 
    int linesFilled; 

    SizeF needed = graphics.MeasureString(text, font, 
              new SizeF(width, 
                float. 
                 PositiveInfinity), 
              StringFormat. 
               GenericTypographic, 
              out charsFitted, 
              out linesFilled); 

    while (linesFilled > numOfLines) 
    { 
     width += averageWidth; 
     needed = graphics.MeasureString(text, font, 
             new SizeF(width, 
                float.PositiveInfinity), 
             StringFormat.GenericTypographic, 
             out charsFitted, out linesFilled); 
    } 

    return needed; 
} 

用法示例:

Font font = new Font("Arial", 12, FontStyle.Regular, 
        GraphicsUnit.Pixel); 
Graphics g = Graphics.FromImage(new Bitmap(1, 1)); 
string text = "Some random text with words in it."; 

SizeF size = CalculateWidth(font, g, 3, text); 
+0

這將假設你只需要一個字的一個字。 – 2008-11-11 15:07:17