C#绘制字符串的字母间距

14

在使用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 i n g 这样。

4个回答

16

默认情况下不支持该功能。您需要逐个绘制每个字母(难以正确执行),或者自己在字符串中插入空格。使用Graphics.ScaleTransform()可以拉伸字母,但会显得很丑。


我能够单独绘制每个字母。 - beckelmw
6
尽管听起来不太好,但我很欣赏有人出面告诉你某件事没有得到支持。 - user153923

8

另外,您可以使用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); 
}  

2
我知道这个问题很久以前就有答案了,但是我似乎无法让它工作。我错过了什么吗? - c00000fd
我也是。我的意思是,代码可以编译,但设置额外的空格没有视觉效果。 - Tohnmeister
2
我不明白为什么这个答案有8个赞。它是无意义的。SetTextCharacterExtra()是一个GDI API,而Graphics.DrawString()是一个GDI ++函数,根本不受GDI设置的影响。但是,如果您使用Textrenderer.DrawText()而不是Graphics.DrawString(),则可以解决问题。 - Elmue

2

1

虽然不被支持,但你可以通过一个小技巧来实现。你可以遍历字符串中的所有字母,并在它们之间插入空格字符。你可以创建一个简单的函数来实现:

编辑 - 我在 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));

谢谢你的代码。不过最终我还是能够单独绘制每个字符。 - beckelmw
没问题。你的选择也不差。 - David
如何使用s= string.Join(" ", s.ToArray()); - The One
The One的评论是正确答案,简洁明了且完美运作。 - harry4516

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接