我正在使用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
调用来处理各行以及整个文本块的垂直对齐。任何提示?
答案 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。