为什么TextRenderer在测量文本时会添加边距?

时间:2014-04-09 07:24:56

标签: c# winforms textrenderer

由于我的应用程序中某些地方缺少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);
    }
}

给出以下结果:

Text with margins

为什么会这样做?有没有办法强制它获得真正的文字大小? (当然,它会在它返回的同一个矩形中绘制)

1 个答案:

答案 0 :(得分:4)

来自MSDN

  

例如,TextRenderer的默认行为是将填充添加到绘制文本的边界矩形以容纳悬垂字形。如果您需要在没有这些额外空格的情况下绘制一行文本,请使用带有DrawTextMeasureText参数的SizeTextFormatFlags版本,如示例所示

您还必须传递Graphics对象才能获得正确的结果,因为:

  

MeasureText(String, Font, Size, TextFormatFlags)的此重叠将忽略TextFormatFlagsNoPaddingLeftAndRightPadding值。如果要指定默认值以外的填充值,则应使用带有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