【问题标题】:C# GDI+ can't draw text with spacesC# GDI+ 不能用空格绘制文本
【发布时间】:2015-07-28 06:40:31
【问题描述】:

我有一些代码:

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

但是文字在单词之间只有一个空格。其他空格被删除。 如何绘制所有空格的文本?

【问题讨论】:

  • 示例代码过于复杂。为什么不创建一个以空格开头的字符串。所以删除对替换的调用。尽可能简单。
  • 当我测试你的代码时,\t 没有被空格替换,你必须在替换后得到 \t。使用 text = text.Replace("\t", 空格);将 \t 替换为空格
  • 某些(正常)空格在某些字体中显得非常小。一些字体有更大的空格(em-spaces),这可能会有所帮助。但是如果你打印一个没有空格的相同字符串,你会看到空格..
  • 阿迪尔,这行得通:text.Replace(@"\t", spaces);但不是这个: text.Replace("\t", spaces);

标签: c# gdi+


【解决方案1】:

改用 TextRenderer.DrawText。这也是自 .NET 2.0 以来 Windows.Forms 使用的内容,除非打开 UseCompatibleTextRendering。

TextRenderer.DrawText(graphics, text, font,
    new Point(offsetX, offsetY), Color.Black, TextFormatFlags.ExpandTabs);

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      问题是你的字体,有些字体是等宽的(所有字母都有相同的空间,包括空格)而其他没有(每个字母不同的空间,例如“i”的空间比“M”少)。请将您的字体更改为等宽字体。

      您看到您的文本似乎只有一个空格,因为非等宽字体的空格比等宽字体的短。

      您可以阅读有关monospaced fonts in Wikipedia 的更多信息。

      【讨论】:

        猜你喜欢
        • 2021-10-16
        • 2017-05-31
        • 2011-07-15
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2014-06-26
        • 2019-04-22
        相关资源
        最近更新 更多