2013-03-25 50 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的大小沒有文字的大小相匹配的結論。

相關問題