字母间距与DrawString?

时间:2017-08-10 06:15:56

标签: c# vb.net dll gdi+ gdi

C# Drawstring Letter Spacing关于字母间距的旧帖子的回答中,我看到了:

[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

在一个功能中:

 With gClsGraphics1
            'Drawstring
            .SmoothingMode = SmoothingMode.HighQuality
            .TextRenderingHint = Text.TextRenderingHint.ClearTypeGridFit
            .CompositingQuality = CompositingQuality.HighQuality

            Dim hdc As IntPtr = .GetHdc()
            SetTextCharacterExtra(hdc, 30)
           .ReleaseHdc(hdc)

        End With

1 个答案:

答案 0 :(得分:1)

这不是您帖子正文中的问题的答案,只是标题中问题的解决方法。

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

使用普通空格会相当粗糙,但还有其他很好的Junio C Hamano -- gitster --

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

..你可以观察到有趣的差异:

commit 15595ce

正如您所看到的,对于单行文本,头发空间将允许最精细地调整伪字符间距;但对于多行文本而言,不间断的空间是可取的。但它仍然会在线条前面留出空白区域。

但由于缺少行间距没有实用或至少简单的解决方法,结论仍然存在:GDI +中的排版支持