我不认为 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;
}
}
您可能可以优化它,使每个字符只调用一次 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++;
}
}