如何使用DrawString为只包含空格的字符串绘制下划线?

时间:2017-10-25 05:36:20

标签: c# msdn

如果我只使用下划线样式绘制文本(仅空格),我就会遇到下划线缺失问题。请在下面参考下面尝试过的代码,让我知道解决此问题的解决方案。

Bitmap bitmap = new Bitmap(400, 200);
Graphics graphics = Graphics.FromImage(bitmap);
Brush brush = new SolidBrush(Color.White);
graphics.FillRectangle(brush, 0, 0, 400, 200);
System.Drawing.Font font = new System.Drawing.Font("Arial", 12, FontStyle.Underline);
brush = new SolidBrush(Color.Black);
StringFormat stringformat = new StringFormat(StringFormat.GenericTypographic);
stringformat.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
string text = "Hello";
SizeF sizeF = m_graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush, new RectangleF(0, 0, sizeF.Width, sizeF.Height), stringformat);
text = "     ";
float width = sizeF.Width;
sizeF = m_graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush, new RectangleF(width, 0, sizeF.Width, sizeF.Height), stringformat);
text = "World";
width += sizeF.Width;
sizeF = m_graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush, new RectangleF(width, 0, sizeF.Width, sizeF.Height), stringformat);

1 个答案:

答案 0 :(得分:2)

据我所知,您有三种选择:

  1. 使用等宽字体( Courier New Lucida Sans Typewriter )。有关等宽字体herehere的更多信息。

    System.Drawing.Font font = 
                        new System.Drawing.Font("Courier New", 12, FontStyle.Underline);
    
  2. 立即撰写文字。如果只编写空格,那么即使使用TextRenderer绘制字符串,该方法也不起作用。因此,如果您单独收到字符串,我建议将它们添加到StringBuilder中并绘制整个文本或句子。

    var sb = new StringBuilder();
    sb.Append("Hello");
    sb.Append("     ");
    sb.Append("World!");        
    
    var bitmap = new Bitmap(400, 200);
    var graphics = Graphics.FromImage(bitmap);
    Brush brush = new SolidBrush(Color.White);
    graphics.FillRectangle(brush, 0, 0, 400, 200);            
    var font = new Font("Arial", 12, FontStyle.Underline);
    brush = new SolidBrush(Color.Black);
    var stringformat = new StringFormat(StringFormat.GenericTypographic);
    stringformat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
    stringformat.Trimming = StringTrimming.None;
    var text = sb.ToString();                          
    var sizeF = graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
    graphics.DrawString(text, font, brush, 
                         new RectangleF(5, 0, sizeF.Width, sizeF.Height), stringformat);
    
  3. 黑客版本:您可以绘制一个不可见的字符,例如(char)127,这是删除字符,就像这样(您可以使用第2点的代码并添加此初始化StringBuilder时的行:

    sb.Append(new string ((char)127, 5)); //this will create approx. five spaces.
    

    如果需要,您可以使用其他不可见的字符。

  4. 第3个选项是黑客,应该这样考虑,如果你可以改变字体,我建议选项1,否则选项2。