2013-03-25 62 views
0

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

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

MyDrawString("Test")    ->  Test| 

MyDrawString("Test ")   -> Test | 

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

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

          Test | 
             Line 2 | 

有没有一种方法可以达到我想要的东西不分手的字符串,并以白描它行?

如果不是这样,在同一垂直位置单独绘制线条以便单个调用将使用的最佳方法是什么? MeasureString().Height没有给我两条线之间的全部距离。

UPDATE

我发现this MSDN page解释如何确定行高时DrawString绘制多行字符串。尽管如此,我仍然倾向于使用一个单独的DrawString调用来处理各行的垂直对齐以及整个文本块。任何提示?

+0

它很容易测试你自己的最后一个问题。 – 2013-03-25 07:39:00

+0

你说得对。不幸的是,结果导致另一个挑战。我已经相应地更新了这个问题。 – 2013-03-25 07:56:17

回答

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 

注意代码的调整将需要采取自动换行和LineAlignment考虑如果layoutRect的大小没有文字的大小相匹配的结论。

相关问题