测量包装字符串

8

我正在尝试创建一个控件,基本上允许我在彼此之下绘制不同的字符串。但是,这些字符串的宽度可能不大于控件的宽度。为了解决这个问题,我考虑将一个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);

问题在于,如果一些文本被换行了,第三行的文字将会覆盖第一行的文字,从而使其难以/不可能读取。

我正在寻找解决这个问题的方法,我找到了一些有趣的链接,但是它们包括使用for循环来测量每个字符的宽度等操作。是否有更简单的方法?


你有没有考虑使用带换行的TextBlock?你尝试构建的控件看起来很像ListView,为什么要自定义控件呢? - paparazzo
我曾考虑使用ListView。然而,我的控件代表了一个时间表,我的程序可以打印出来。而且打印的ListView并不好看,所以我一直在尝试创建自己的控件。哦,对了,抱歉,我忘了说我正在使用WinForms。我已经编辑了我的问题。 - haiyyu
1个回答

9
你可以使用 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);

1
很遗憾,我已经尝试过了。MeasureString不支持自动换行。 - haiyyu
6
引用文档的说法,“width参数指定返回的SizeF结构(Width)中宽度组件的最大值。如果width参数小于字符串的实际宽度,则返回的Width组件被截断为一个代表在指定宽度内适合的最大字符数的值。为了容纳整个字符串,返回的Height组件被调整为一个允许字符换行显示的值。”。 参考链接:http://msdn.microsoft.com/en-us/library/9bt8ty58.aspx - Sam Greenhalgh
哦,我明白了。我其实已经读过那个页面,可能是我误解了它。谢谢! - haiyyu
我不确定过去5年API是否有所改变,但是我能够用以下代码实现此功能:drawing2.DrawString(text, font, textBrush, new RectangleF(0, yTextPlacement, textSize.Width, textSize.Height)); - TravisWhidden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接