在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
答案 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);
}
..你可以观察到有趣的差异:
正如您所看到的,对于单行文本,头发空间将允许最精细地调整伪字符间距;但对于多行文本而言,不间断的空间是可取的。但它仍然会在线条前面留出空白区域。
但由于缺少行间距没有实用或至少简单的解决方法,结论仍然存在:GDI +中的排版支持差。