不幸的是,您确实需要使用Graphics
对象来执行此操作。
我使用的 C# 代码(返回 a RectangleF
,因为我想知道宽度和高度)如下:
/// <summary> The text bounding box. </summary>
private static readonly RectangleF __boundingBox = new RectangleF(29, 25, 90, 40);
/// <summary>
/// Gets the width of a given string, in the given font, with the given
/// <see cref="StringFormat"/> options.
/// </summary>
/// <param name="text">The string to measure.</param>
/// <param name="font">The <see cref="Font"/> to use.</param>
/// <param name="fmt">The <see cref="StringFormat"/> to use.</param>
/// <returns> The floating-point width, in pixels. </returns>
private static RectangleF GetStringBounds(string text, Font font,
StringFormat fmt)
{
CharacterRange[] range = { new CharacterRange(0, text.Length) };
StringFormat myFormat = fmt.Clone() as StringFormat;
myFormat.SetMeasurableCharacterRanges(range);
using (Graphics g = Graphics.FromImage(
new Bitmap((int) __boundingBox.Width, (int) __boundingBox.Height)))
{
Region[] regions = g.MeasureCharacterRanges(text, font,
__boundingBox, myFormat);
return regions[0].GetBounds(g);
}
}
根据指定为 的边界框,这将返回RectangleF
整个文本字符串大小的 a ,必要时自动换行__boundingBox
。从好的方面来说,Graphics
一旦using
语句完成,对象就会被销毁……</p>
顺便说一句,GDI+ 在这方面似乎很不可靠。我发现它有很多错误(例如,请参阅我的问题“Graphics.MeasureCharacterRanges 在 C#.Net 中给出错误的大小计算?”</a>)。如果您可以使用TextRenderer.DrawText
from System.Windows.Forms
,请执行此操作。