Cur*_*urt 4 .net fonts drawing system.drawing
使用System.Drawing.Font,是否可以更改字母间距,就像可以更改字体大小一样?
我正在寻找增加字母间距以适合特定宽度的方法。
如果无法做到这一点,是否有其他替代方法可获得理想的效果?例如,是否有一种简单的方法来制作多个适合我特定宽度的图形?
我认为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)