Интервал между строками строки С#
Есть ли возможность контролировать расстояние между буквами при использовании Graphics.DrawString? Я не могу найти перегрузки DrawString или Font, которые позволили бы мне это сделать.
g.DrawString("MyString", new Font("Courier", 44, GraphicsUnit.Pixel), Brushes.Black, new PointF(262, 638));
Под буквенным интервалом я подразумеваю расстояние между буквами. С интервалом MyString может выглядеть как M y S t r я n g, если я добавил достаточно места.
Ответы
Ответ 1
Это не поддерживается из коробки. Вам придется либо рисовать каждую букву отдельно (трудно получить это право), либо вставлять пробелы в строку самостоятельно. Вы можете растягивать буквы с помощью Graphics.ScaleTransform(), но это выглядит неуклюже.
Ответ 2
В качестве альтернативы вы можете использовать функцию API GDI SetTextCharacterExtra(HDC hdc, int nCharExtra)
(документация MSDN):
[DllImport("gdi32.dll", CharSet=CharSet.Auto)]
public static extern int SetTextCharacterExtra(
IntPtr hdc, // DC handle
int nCharExtra // extra-space value
);
public void Draw(Graphics g)
{
IntPtr hdc = g.GetHdc();
SetTextCharacterExtra(hdc, 24); //set spacing between characters
g.ReleaseHdc(hdc);
e.Graphics.DrawString("str",this.Font,Brushes.Black,0,0);
}
Ответ 3
Он не поддерживается, но в качестве взлома вы можете прокручивать все буквы в строке и вставлять пробельный символ между ними. Вы можете создать для него простую функцию как таковую:
Изменить - я повторно сделал это в Visual Studio и протестировал - теперь ошибки удалены.
private string SpacedString(string myOldString)
{
System.Text.StringBuilder newStringBuilder = new System.Text.StringBuilder("");
foreach (char c in myOldString.ToCharArray())
{
newStringBuilder.Append(c.ToString() + ' ');
}
string MyNewString = "";
if (newStringBuilder.Length > 0)
{
// remember to trim off the last inserted space
MyNewString = newStringBuilder.ToString().Substring(0, newStringBuilder.Length - 1);
}
// no else needed if the StringBuilder length is <= 0... The resultant string would just be "", which is what it was intitialized to when declared.
return MyNewString;
}
Затем ваша строка кода была бы просто изменена как:
g.DrawString(SpacedString("MyString"), new Font("Courier", 44, GraphicsUnit.Pixel), Brushes.Black, new PointF(262, 638));
Ответ 4
Я действительно верю, что ExtTextOut решит вашу проблему. Вы можете использовать параметр lpDx для добавления массива межсимвольных расстояний. Вот соответствующая документация MSN:
http://msdn.microsoft.com/en-us/library/dd162713%28v=vs.85%29.aspx