【问题标题】:Measure wrapped string测量缠绕的字符串
【发布时间】:2012-02-03 06:06:35
【问题描述】:

我正在尝试创建一个控件,它基本上允许我在彼此下方绘制不同的字符串。 但是,字符串的宽度可能不会大于控件的宽度。 为了解决这个问题,我正在考虑将一个 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 循环来测量每个字符的宽度等等。 有没有更简单的方法?

【问题讨论】:

  • 您是否考虑过仅使用带有 Wrapping 的 TextBlock?您尝试构建的控件看起来很像 ListView。为什么是自定义控件?
  • 我确实考虑过使用 ListView。但是,我的控件代表我的程序能够打印的时间表。而且打印出来的 ListView 看起来不太好,所以我一直在尝试创建自己的控件。哦,对不起,我忘了提到我正在使用 WinForms。我已经编辑了我的问题。

标签: c# winforms gdi+ word-wrap


【解决方案1】:

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

【讨论】:

  • 很遗憾,我试过了。 MeasureString 不支持自动换行。
  • 确实如此,引用文档“width参数指定返回的SizeF结构的宽度分量的最大值(Width)。如果width参数小于字符串的实际宽度,返回的 Width 组件被截断为一个值,该值表示将适合指定宽度的最大字符数。为了容纳整个字符串,返回的 Height 组件被调整为一个允许显示字符串的值。 msdn.microsoft.com/en-us/library/9bt8ty58.aspx
  • 哦,我明白了。我实际上已经阅读了该页面,我一定误解了它。谢谢!
  • 我不确定 API 在过去 5 年中是否发生了变化,但我能够使用它:drawing2.DrawString(text, font, textBrush, new RectangleF(0, yTextPlacement, textSize.Width, textSize.Height));
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多