2012-02-02 123 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