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