【发布时间】:2008-11-10 23:24:49
【问题描述】:
如果文本应该在空白处中断,您如何计算在 X 行中显示字符串所需的最小宽度?
【问题讨论】:
-
等宽字体还是等比例字体?
如果文本应该在空白处中断,您如何计算在 X 行中显示字符串所需的最小宽度?
【问题讨论】:
可能的提示:也许是某种使用 Graphics.MeasureString() 的二分搜索?
【讨论】:
编辑:没有意识到您想尝试将文本调整到固定的行数。这是一个很难尝试解决的问题。这是我能想到的最好的,可能不是最优雅的,但它似乎有效:
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);
【讨论】: