C# 用抽绳隔开字母间距?

C# 用抽绳隔开字母间距?,c#,vb.net,dll,gdi+,gdi,C#,Vb.net,Dll,Gdi+,Gdi,在回答一篇关于字母间距的老帖子时,我看到: [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.G

在回答一篇关于字母间距的老帖子时,我看到:

[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); 
}  
我尝试了正数和负数(转换为VB.NET),但没有任何效果。它是有效的代码段还是不正确的

  <DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
    Public Shared Function SetTextCharacterExtra(ByVal hdc As IntPtr, ByVal nCharExtra As Integer) As Integer
        ' extra-space value
    End Function

这不是你文章正文中问题的答案,只是标题中问题的解决方法

因此,虽然我甚至不尝试使用任何遗留函数,但我只是在普通字符之间添加空格

使用普通空间会相当粗糙,但也有其他好处:

使用这样一个简单的函数..:

string spaced(string text, int spacing, char space)
{
    string spaces = "".PadLeft(spacing, space);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < text.Length; i++) sb.Append(text[i] + spaces);
    return sb.ToString().Trim(space);
}
字符串间距(字符串文本、整数间距、字符间距)
{
字符串空格=“.PadLeft”(间距,空格);
StringBuilder sb=新的StringBuilder();
for(int i=0;i
…您可以观察到有趣的差异:

如您所见,对于单行文本,头发空间将允许对伪字符间距进行最精细的调整;但对于多行文本,最好使用不间断的空格。不过,它仍然允许在行前留有空白


但由于缺少行距没有实际的解决办法,或者至少没有简单的解决办法,因此结论仍然是:GDI+中的排版支持

Windows有多个文本渲染引擎,所有这些引擎都保留下来以保持旧程序运行。DrawString使用的是一个非常不可靠的类,微软被迫在.NET2.0中添加TextRenderer类,以帮助程序员摆脱有时相当糟糕的工件。STCE已经很老了,当然您还必须使用TextOut()来绘制文本。请注意MSDN文章如何特别警告您不应再使用它。谢谢-很有趣。我想我甚至会查找负空格字符,但我认为它们不存在。嗯,我记得我见过它们。它们被用在一种亚洲语言中,意思是覆盖在它们周围的两个字符上。不确定这是否符合“空白”的条件,也不确定人们是否可以期望在西方字体中找到它们。。
char thin_space = (char)0x2009;
char hair_space = (char)0x200a;
char narrow_nbr_space = (char)0x202f;
string spaced(string text, int spacing, char space)
{
    string spaces = "".PadLeft(spacing, space);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < text.Length; i++) sb.Append(text[i] + spaces);
    return sb.ToString().Trim(space);
}