当我使用相同的文本和格式标志调用Graphics.MeasureCharacterRanges两次,但使用第一次调用的输出矩形作为第二次调用的边界矩形时,结果变小。如果原始结果正确地绑定了文本,那么对于在第一次给我的矩形中传递的任何后续调用,结果是否应该相同?
这是我的代码和结果(内联):
private static void MeasureStringTest()
{
var size = MeasureString("abcdefghijklmnopqrstuvwxyz", 500.0f, 100.0f);
}
private static Size MeasureString(string text, float width, float height)
{
using (Bitmap bmp = new Bitmap((int)width, (int)height))
using (Graphics graphics = Graphics.FromImage(bmp))
{
StringFormat format = new StringFormat
{
FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoClip | StringFormatFlags.NoFontFallback
};
RectangleF rect = new RectangleF(0, 0, width, height);
CharacterRange[] ranges = { new CharacterRange(0, text.Length) };
format.SetMeasurableCharacterRanges(ranges);
// First call, using the given dimensions
Region[] regions1 = graphics.MeasureCharacterRanges(text, font, rect, format);
RectangleF result1 = regions1[0].GetBounds(graphics);
// result1.Width: 159.0; result1.Height: 17.0
// Second call, using the bounding rectangle from the first call
Region[] regions2 = graphics.MeasureCharacterRanges(text, font, result1, format);
RectangleF result2 = regions2[0].GetBounds(graphics);
// result2.Width: 142.0; result2.Height: 17.0
// Third call, using an empty bounding rectangle
Region[] regions3 = graphics.MeasureCharacterRanges(text, font, new RectangleF(0, 0, 0, 0), format);
RectangleF result3 = regions3[0].GetBounds(graphics);
// result3.Width: 159.0; result3.Height: 17.0
return new Size((int)result1.Width, (int)result1.Height);
}
}
从概念上讲,这就是我对谈话的感受:
- 我:如果我有500像素,我需要多少像素 这个字符串?
- 图形:你需要159像素。
- 我:如果我有159个像素,那么我需要多少个像素呢?
- 图形:你需要142像素。
- 我:我以为你说我需要159像素?
当我将文本和边界矩形绘制到位图并在屏幕上显示(使用PictureBox控件)时,我看到原始结果(159x17) 正确绑定了文本。不幸的是,我正在开发的项目依赖于此函数来处理比我在此处描述的更复杂的布局方案,并且我在调试它时遇到了问题而没有理解我上面概述的问题。