2017-04-25 20 views
0

在我的帳單應用程序中,帳單是使用Graphics.DrawString方法等打印的。當使用帶有自動換行的Graphics.DrawString來繪製ItemName時,它將單詞包裝成許多行。所以它消耗了很多行。Graphics.Drawstring WordWrap不是預期的

我使用簡單的代碼重新創建了該問題。使用此代碼,我期待輸出如下圖所示: Expected Output designed using MS Paint

這是我的示例代碼。

string FONTNAME = "Tahoma"; 
text = "C# is a simple, modern, general-purpose, object-oriented programming language"; 
e.Graphics.DrawString(text, new Font(FONTNAME, 12, FontStyle.Bold), drawBrush, new RectangleF(0, 0, 100.0F, 200F), new StringFormat()); 
e.Graphics.DrawRectangle(new System.Drawing.Pen(drawBrush), 0, 0, 100.0F, 200F); 

但我發現了以下的輸出: Output Image

是否有任何選項來打破的話,而不是自動換行?

+0

您的預期輸出是錯誤的。 WordWrap不會打破單詞,它將包裹在空格上。 –

+0

我的問題是,是否有任何選項可以打破 –

+1

這個詞無論您想要稱爲第一個版本,都絕對不是*換行。畫這樣的東西似乎沒什麼意義,沒有用戶會欣賞它。如果*有*,那麼完全可以使用Graphics.MeasureString()來找出每條線上的內容。 –

回答

1

不,Graphics.DrawString沒有任何選項打破字符(而不是整個單詞)。

要控制打包,您可以傳遞一個StringFormat對象,它初始化爲StringFormatFlags。唯一相關的標誌是StringFormatFlags.NoWrap。在.NET文檔是不是非常有幫助,但如果我們看一下GDI+ documentation(這是底層庫),我們讀到:

StringFormatFlagsNoWrap

指定文本換行到下一個行被禁用。 ...在矩形內繪製文本時,默認情況下,文本在矩形邊界內部的最後一個單詞邊界處斷開,並纏繞到下一行。

因此,唯一的選擇是在字邊界包裝,或根本不執行包裝。

要得到您想要的輸出,您需要逐個字符地測量並繪製多個字符串(每行一個)。

+0

感謝您的回覆@BradleyGrainger。 –

+0

現在我通過用點(**。**)替換字符串中的所有空格來實現結果。 –