1

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

给出以下结果:

带边距的文本

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

4

1 回答 1

4

来自MSDN

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

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

此重载 ofMeasureText(String, Font, Size, TextFormatFlags)将忽略or的TextFormatFlags值。如果您指定的填充值不是默​​认值,则应使用接受对象的重载。NoPaddingLeftAndRightPaddingMeasureText(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 wrongly trimming text

于 2014-04-09T07:46:51.980 回答