C# GDI+无法绘制带有空格的文本。

3

我有一些代码:

string text = "Some text\t with tabs\t  here!";
string spaces = "";
for (int i = 0; i < 4; i++)
{
    spaces += " ";
}

text = text.Replace(@"\t", spaces);

我将所有制表符替换为四个空格,然后尝试绘制文本:
graphics.DrawString(text, font, new SolidBrush(Color.Black), offsetX, offsetY);

但是文本中单词之间只有一个空格,而其他空格已被删除。如何绘制包含所有空格的文本?


3
示例代码过于复杂。为什么不一开始就创建一个包含空格的字符串呢?这样就可以省去调用 Replace 函数的步麻烦了,尽可能保持简单。 - David Heffernan
当我测试你的代码时,\t没有被替换成空格,你一定是在replace之后得到了\t。使用text = text.Replace("\t", spaces); 将会把\t替换成空格。 - Adil
有些字体中的一些(普通)空格非常小。有些字体具有更大的空格(em-spaces),这可能会有所帮助。但是,如果您将一个带有空格的字符串和一个没有空格的相同字符串打印在彼此上方,您将看到空格。 - TaW
阿迪尔,这个可以:text.Replace(@"\t", spaces); 但是这个不行:text.Replace("\t", spaces); - Anton23
3个回答

3
请使用TextRenderer.DrawText代替。自.NET 2.0以来,Windows.Forms也使用这个方法,除非启用了UseCompatibleTextRendering。
TextRenderer.DrawText(graphics, text, font,
    new Point(offsetX, offsetY), Color.Black, TextFormatFlags.ExpandTabs);

好的建议。为什么要省略 e.Graphics.DrawString("Hello World ", Font, new SolidBrush(SystemColors.ControlText), 20, 100); 的最后10个空格字符?我必须使用 TextRender.DrawText。 - qtg

2

要么两个字符串都是原样字符串,要么都不是。原样字符串(即@"string")的意思是,在下一个引号字符出现之前,不对字符应用任何解释

因此,请尝试这样做:

string text = "Some text\t with tabs\t  here!";
...
text = text.Replace("\t", spaces);

或者这样:
string text = @"Some text\t with tabs\t  here!";
...
text = text.Replace(@"\t", spaces);

2
问题在于您的字体,有些字体具有等宽(所有字母的空间都相同,包括空格),而其他字体则没有(每个字母的空间不同,例如“i”的空间比“M”小)。请将您的字体更改为等宽字体,无论是什么字体。
您可以看到,您的文本似乎只有单个空格,因为非等宽字体中的空格比等宽字体中的空格短。
您可以在维基百科上了解更多关于等宽字体的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接