由于我的应用程序中某些地方缺少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的默认行为是将填充添加到绘制的文本的边界矩形中,以容纳突出的字形。如果您需要绘制一行文本而没有这些多余的空格,请使用带有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

关于c# - 为什么TextRenderer在测量文本时增加边距?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22955612/

10-17 02:03