由于我的应用程序中某些地方缺少Graphics对象,我决定使用TextRenderer类。但令人惊讶的是,它为测量文本增加了很多余量。例如:
private void button1_Click(object sender, EventArgs e) {
using (var g = this.CreateGraphics()) {
Font font = new Font("Calibri", 20.0f, GraphicsUnit.Pixel);
Size size = TextRenderer.MeasureText("Ala ma kota", font);
g.DrawRectangle(Pens.Red, new Rectangle(new Point(10, 10), size));
TextRenderer.DrawText(g, "Ala ma kota", font, new Point(10, 10), Color.Black);
}
}
给出以下结果:
为什么会这样做?有没有办法强制它获得真正的文字大小? (当然,它会在它返回的同一个矩形中绘制)
答案 0 :(得分:4)
来自MSDN:
例如,
TextRenderer
的默认行为是将填充添加到绘制文本的边界矩形以容纳悬垂字形。如果您需要在没有这些额外空格的情况下绘制一行文本,请使用带有DrawText
和MeasureText
参数的Size
和TextFormatFlags
版本,如示例所示
您还必须传递Graphics
对象才能获得正确的结果,因为:
MeasureText(String, Font, Size, TextFormatFlags)
的此重叠将忽略TextFormatFlags
或NoPadding
的LeftAndRightPadding
值。如果要指定默认值以外的填充值,则应使用带有MeasureText(IDeviceContext, String, Font, Size, TextFormatFlags)
对象的IDeviceContext
重载。
Size size = TextRenderer.MeasureText(g,
"Ala ma kota",
font,
new Size(int.MaxValue, int.MaxValue),
TextFormatFlags.NoPadding);
TextRenderer.DrawText(g, "Ala ma kota", font,
new Point(10, 10),
Color.Black,
TextFormatFlags.NoPadding);
g.DrawRectangle(Pens.Red, new Rectangle(new Point(10, 10), size));
另请参阅直接使用Graphics
方法:GDI+ MeasureString() is incorrectly trimming text