2010-06-03 8 views
11

Est-il possible de contrôler l'espacement des lettres lors de l'utilisation de Graphics.DrawString? Je ne trouve aucune surcharge sur DrawString ou Font qui me permettrait de le faire.Espacement des lettres C# Drawstring

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

Par espacement des lettres, j'entends la distance entre les lettres. Avec l'espacement, MyString pourrait ressembler à M Y S t r i g si j'ai ajouté assez d'espace.

Répondre

12

Ce n'est pas pris en charge dès la sortie de la boîte. Vous devrez soit dessiner chaque lettre individuellement (difficile d'obtenir ce droit) ou insérer des espaces dans la chaîne vous-même. Vous pouvez étirer les lettres en utilisant Graphics.ScaleTransform() mais cela semble fugly.

+0

j'ai pu simplement tirer chaque lettre individuellement. – beckelmw

+4

+1. Bien que ce ne soit pas agréable à entendre, j'apprécie quand quelqu'un sort et vous dit que quelque chose n'est pas supporté. – jp2code

1

Ce n'est pas pris en charge, mais en tant que hack, vous pouvez parcourir toutes les lettres de la chaîne et insérer un caractère espace vide entre chacune d'entre elles. Vous pouvez créer une fonction simple en tant que telle:

Édition - J'ai refait cela dans Visual Studio et j'ai testé - les bugs sont maintenant supprimés.

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; 
} 

Ensuite, votre ligne de code ci-dessus serait juste modifié comme:

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

Merci pour le code. J'ai fini par être capable de dessiner chaque personnage individuellement. – beckelmw

+0

Pas de problème. Le vôtre n'est pas une mauvaise option non plus. – David

+0

Si vous utiliseriez des espaces fins, ce serait une très bonne réponse. – TaW

7

Sinon, vous pouvez utiliser la fonction API GDI SetTextCharacterExtra(HDC hdc, int nCharExtra) (MSDN documentation):

[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); 
} 
+0

Je sais que cela a été répondu il y a longtemps, mais je n'arrive pas à le faire fonctionner. Est-ce que je manque quelque chose? – c00000fd

+0

Ne fonctionnait pas pour moi aussi. – docesam