2010-06-03 22 views
11

¿Es de alguna manera posible controlar el espaciado entre letras cuando se utiliza Graphics.DrawString? No puedo encontrar ninguna sobrecarga en DrawString o Font que me permita hacerlo.C# Drawstring Letter Spacing

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

Por espaciado entre letras me refiero a la distancia entre letras. Con el espaciamiento de MyString podría parecerse a M y S si agrega suficiente espacio.

Respuesta

12

Eso no es compatible desde el primer momento. Deberá dibujar cada letra individualmente (difícil de obtener bien) o insertar espacios en la cadena usted mismo. Puede estirar las letras usando Graphics.ScaleTransform() pero se ve fugly.

+0

pude simplemente dibujar cada letra individual. – beckelmw

+4

+1. Aunque no es agradable de escuchar, aprecio cuando alguien sale y te dice que algo no es compatible. – jp2code

1

No es compatible, pero como un truco, puede recorrer todas las letras de la cadena e insertar un espacio en blanco entre cada una. Puede crear una función simple para él como tal:

Editar - He vuelto a hacer esto en Visual Studio y probado - los errores se han eliminado.

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

Luego, su línea de código anterior solo se modificaría como:

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

Gracias por el código. Sin embargo, terminé dibujando cada personaje individualmente. – beckelmw

+0

No hay problema. La tuya tampoco es una mala opción. – David

+0

Si usa espacios delgados sería una muy buena respuesta. – TaW

7

otra posibilidad es utilizar la función GDI API 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

Sé que ha sido respondida hace mucho tiempo, pero parece que no puedo hacer que funcione. ¿Me estoy perdiendo de algo? – c00000fd

+0

No funcionó para mí también. – docesam

Cuestiones relacionadas