C # DrawString () пробел между буквами [дубликат]

//es6
//array.from
const reverseString = (string) => Array.from(string).reduce((a, e) => e + a);
//split
const reverseString = (string) => string.split('').reduce((a, e) => e + a); 

//split problem
"         
11
задан beckelmw 3 June 2010 в 20:32
поделиться

4 ответа

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

13
ответ дан Hans Passant 18 August 2018 в 17:50
поделиться
  • 1
    Я смог просто вытащить каждое письмо индивидуально. – beckelmw 3 June 2010 в 21:49
  • 2
    +1. Хотя не приятно слышать, я ценю, когда кто-то выходит и говорит вам, что что-то не поддерживается. – jp2code 29 April 2011 в 14:28

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

Изменить - я повторно сделал это в 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
ответ дан David 18 August 2018 в 17:50
поделиться
  • 1
    Спасибо за код. В итоге я смог просто нарисовать каждого персонажа, хотя. – beckelmw 3 June 2010 в 21:50
  • 2
    Нет проблем. У вас тоже неплохой вариант. – David 3 June 2010 в 22:24
  • 3
    Если бы вы использовали тонкие пространства, это был бы действительно хороший ответ. – TaW 16 June 2017 в 08:49

Я действительно верю, что ExtTextOut решит вашу проблему. Вы можете использовать параметр lpDx для добавления массива межсимвольных расстояний. Вот соответствующая документация MSN:

http://msdn.microsoft.com/en-us/library/dd162713%28v=vs.85%29.aspx

1
ответ дан Loudenvier 18 August 2018 в 17:50
поделиться

В качестве альтернативы вы можете использовать функцию 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); 
}  
7
ответ дан splattne 18 August 2018 в 17:50
поделиться
  • 1
    Я знаю, что это уже давно ответили, но я не могу заставить его работать. Я что-то упускаю? – c00000fd 15 February 2017 в 10:46
  • 2
    Не работала и для меня. – EKanadily 25 July 2017 в 08:36
Другие вопросы по тегам:

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