System.Drawing.Font-更改字母间距?

Cur*_*urt 4 .net fonts drawing system.drawing

使用System.Drawing.Font,是否可以更改字母间距,就像可以更改字体大小一样?

我正在寻找增加字母间距以适合特定宽度的方法。

如果无法做到这一点,是否有其他替代方法可获得理想的效果?例如,是否有一种简单的方法来制作多个适合我特定宽度的图形?

mus*_*fan 5

我认为DrawString不会允许您指定任何详细信息,例如字符之间的间距,但是我会创建一个辅助函数,该函数根据所需的宽度计算间距,然后绘制每个字符以使其适合。

试试看,看看你如何过...

    public void DrawSpacedText(Graphics g, Font font, Brush brush, PointF point, string text, int desiredWidth)
    {
        //Calculate spacing
        float widthNeeded = 0;
        foreach (char c in text)
        {
            widthNeeded += g.MeasureString(c.ToString(), font).Width;
        }
        float spacing = (desiredWidth - widthNeeded) / (text.Length - 1);

        //draw text
        float indent = 0;
        foreach (char c in text)
        {
            g.DrawString(c.ToString(), font, brush, new PointF(point.X + indent, point.Y));
            indent += g.MeasureString(c.ToString(), font).Width + spacing;
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可能会对此进行优化,以便每个字符仅对MeasureString进行一次调用。甚至使用MeasureCharacterRanges来获取数组(无论如何我相信还是更准确的)

编辑:这是使用MeasureCharacterRanges的示例...

    public void DrawSpacedText(Graphics g, Font font, Brush brush, PointF point, string text, int desiredWidth)
    {
        //Calculate spacing
        float widthNeeded = 0;
        Region[] regions = g.MeasureCharacterRanges(text, font, new RectangleF(point, new SizeF(desiredWidth, font.Height + 10)), StringFormat.GenericDefault);
        float[] widths = new float[regions.Length];
        for(int i = 0; i < widths.Length; i++)
        {
            widths[i] = regions[i].GetBounds(g).Width;
            widthNeeded += widths[i];
        }
        float spacing = (desiredWidth - widthNeeded) / (text.Length - 1);

        //draw text
        float indent = 0;
        int index = 0;
        foreach (char c in text)
        {
            g.DrawString(c.ToString(), font, brush, new PointF(point.X + indent, point.Y));
            indent += widths[index] + spacing;
            index++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • +1这是一个不错的方法。但是,保持恒定的间距会使[文本字距调整](http://en.wikipedia.org/wiki/Kerning)变得很困难。换句话说,引用Wikipedia的结果不会像适当的字距调整那样“视觉上令人愉悦”。 (2认同)