Интервал между строками строки С#

Есть ли возможность контролировать расстояние между буквами при использовании 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