由于我的应用程序中某些地方缺少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);
}
}
给出以下结果:
为什么这样做呢?有没有办法强迫它获得真实的文字大小? (当然,将其绘制在返回的矩形中)
最佳答案
从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关于c# - 为什么TextRenderer在测量文本时增加边距?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22955612/