Межсимвольный интервал C# на шнуровке

Так или иначе возможно управлять межсимвольным интервалом при использовании Графики. DrawString? Я не могу найти перегрузку к DrawString или Шрифту, который позволил бы мне делать так.

g.DrawString("MyString", 
             new Font("Courier", 44, GraphicsUnit.Pixel), 
             Brushes.Black, 
             new PointF(262, 638));

По буквам располагая я с интервалами имею в виду расстояние между буквами. С интервалом MyString мог быть похожим на M y S t r i n g, если бы я добавил достаточно пространства.

12
задан Uwe Keim 12 September 2018 в 09:30
поделиться

3 ответа

Это не поддерживается из коробки. Вам придется либо рисовать каждую букву по отдельности (трудно понять это правильно), либо вставлять пробелы в строку самостоятельно. Вы можете растянуть буквы с помощью Graphics.ScaleTransform(), но это выглядит нечетким образом.

14
ответ дан 2 December 2019 в 06:44
поделиться

Это не поддерживается, но в качестве взлома вы можете перебрать все буквы в строке и вставить между ними пробел. Вы можете создать для него простую функцию как таковую:

Edit - Я повторил это в 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's 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));
1
ответ дан 2 December 2019 в 06:44
поделиться

В качестве альтернативы вы можете использовать функцию GDI API 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); 
}  
7
ответ дан 2 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: