0

我正在使用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没有给我两条线之间的完整距离。

更新

我发现这个 MSDN 页面解释了如何在DrawString绘制多行字符串时确定行高。我仍然更喜欢使用单个DrawString调用来处理各个行以及整个文本块的垂直对齐。有什么提示吗?

4

1 回答 1

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。

于 2013-03-28T08:58:23.057 回答