2012-02-02 82 views
3

我試圖創建一個控制,基本上允許我在下面繪製不同的字符串。 但是,字符串的寬度可能不會大於控件的寬度。 爲了解決這個問題,我正在考慮將一個RectangleF對象傳遞給Graphics.DrawString方法。這將包裝比通過矩形的寬度更寬的字符串。儘管這確實解決了如果太大而不能看到整個弦的問題,但還有另一個問題。如果我要嘗試這樣的事情措施包裹字符串

Graphics g = e.Graphics; // Paint event 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, 12), someRectangleF); 

的問題是,如果someText被包裹,第三行會畫畫的文本在第一文本,從而使其難以/無法讀取。

我正在爲這個問題尋找一個解決方案,並且我發現了一些有趣的鏈接,但是包括使用for循環來測量每個字符的寬度等等。 有沒有更簡單的方法來做到這一點?

+0

您是否考慮過僅使用帶包裝的TextBlock?您正在嘗試構建的控件看起來很像ListView。爲什麼要自定義控件? – Paparazzi 2012-02-02 21:55:16

+0

我確實考慮過使用ListView。但是,我的控制代表了我的程序能夠打印的時間表。並且打印的ListView看起來不太好,所以我一直在試圖創建自己的控件。哦,對不起,我忘了提及我正在使用WinForms。我編輯了我的問題。 – haiyyu 2012-02-02 21:58:22

回答

5

您可以使用Graphics.MeasureString方法來獲取字符串的尺寸並相應地繪製下一個字符串嗎?

SizeF size = g.MeasureString(someText, someFont, someRectangleF.Size.Width); 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, size.Height), someRectangleF); 
+0

不幸的是,我試過了。 MeasureString不支持自動換行。 – haiyyu 2012-02-02 22:01:57

+5

它引用文檔「width參數指定返回的SizeF結構的寬度分量的最大值(寬度)。如果width參數小於字符串的實際寬度,則返回的寬度分量將被截斷爲一個值,表示將適合指定寬度的最大字符數。要容納整個字符串,返回的高度組件將調整爲允許以字符換行顯示字符串的值。 http://msdn.microsoft.com/en-us/library/9bt8ty58.aspx – 2012-02-02 22:05:38

+0

哦,我明白了。我已經看過那個頁面,我一定誤解了它。謝謝! – haiyyu 2012-02-02 22:07:50