14

使用 Graphics.DrawString 时是否可以以某种方式控制字母间距?我找不到任何允许我这样做的 DrawString 或 Font 重载。

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

字母间距是指字母之间的距离。如果我添加了足够的空间,MyString 可能看起来像 M y S 字符串。

4

4 回答 4

15

开箱即用不支持。您要么必须单独绘制每个字母(很难做到这一点),要么自己在字符串中插入空格。您可以使用 Graphics.ScaleTransform() 拉伸字母,但这看起来很丑。

于 2010-06-03T19:50:56.877 回答
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); 
}  
于 2010-07-12T12:23:03.560 回答
2

我真的相信 ExtTextOut 会解决你的问题。您可以使用 lpDx 参数添加字符间距离数组。以下是相关的 MSN 文档:

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

于 2012-05-11T03:18:45.250 回答
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));
于 2010-06-03T20:20:10.337 回答