如何在.NET中绘制带尾随空格的多行字符串

时间:2013-03-25 07:06:27

标签: .net system.drawing

我正在使用Graphics.DrawString绘制字符串,并希望包含尾随空格,因此我使用StringFormatFlags.MeasureTrailingSpaces。对于单行字符串,这工作正常,但我注意到新的行字符也会在行尾产生空白。这不是我想要的(我想知道谁会这样)。

所以我想实现一个创建以下输出的MyDrawString方法。 |是右对齐绘制操作的x坐标。实现也应该适用于居中的字符串。

MyDrawString("Test")              ->       Test|

MyDrawString("Test   ")           ->    Test   |

MyDrawString("Test\r\nLine 2   ") ->       Test|
                                      Line 2   |

不幸的是,最后一次通话的输出看起来更像是

                                         Test  |
                                      Line 2   |

有没有办法实现我想要的而不会分解字符串并逐行绘制?

如果没有,那么在单个DrawString调用将使用的相同垂直位置单独绘制线条的最佳方法是什么? MeasureString().Height没有给我两条线之间的完整距离。

更新

我发现this MSDN page解释了在DrawString绘制多行字符串时如何确定行高。我仍然希望使用单个DrawString调用来处理各行以及整个文本块的垂直对齐。任何提示?

1 个答案:

答案 0 :(得分:0)

我发现在我的情况下,我有文本的边界矩形,这使得自定义实现非常容易。

    Public Shared Sub MyDrawString(ByVal g As Drawing.Graphics, _
                                   ByVal text As String, _
                                   ByVal font As Drawing.Font, _
                                   ByVal brush As Drawing.Brush, _
                                   ByVal layoutRect As Drawing.RectangleF, _
                                   ByVal stringFormat As Drawing.StringFormat)

        Dim lineSpacingPixel As Single
        lineSpacingPixel = font.Size * font.FontFamily.GetLineSpacing(font.Style) / _
            font.FontFamily.GetEmHeight(font.Style)

        Dim lines() As String
        lines = text.Split(New String() {vbCrLf}, StringSplitOptions.None)

        For i = 0 To lines.Count - 1
            Dim rect As Drawing.RectangleF
            rect = New Drawing.RectangleF(layoutRect.X, layoutRect.Y + i * lineSpacingPixel, _
                                          layoutRect.Width, _
                                          layoutRect.Bottom - layoutRect.Y - i * lineSpacingPixel)

            g.DrawString(lines(i), font, brush, rect, stringFormat)
        Next i

    End Sub

请注意,如果layoutRect的大小与要绘制的文本的大小不匹配,则需要进行代码调整以考虑自动换行和LineAlignment。