Я не думаю, что 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++;
}
}