【问题标题】:How to color individual characters and maintain proper spacing / kerning / alignment?如何为单个字符着色并保持适当的间距/字距/对齐?
【发布时间】:2012-10-21 06:17:47
【问题描述】:

我想使用 Graphics.DrawString 来使用单独的颜色绘制字符。

问题是每次调用 DrawString 时,我都必须知道相对于其他字符的位置(使用点或矩形)。

考虑到在具有 StringFormat 的矩形中使用 DrawString 时发生的字距调整和换行,这几乎是可能的。 StringFormat 对于指定对齐、环绕、修剪等很重要。

理想情况下,我可以告诉 DrawString 如何单独为每个字符着色。另一种选择是如果我可以使用 StringFormat 测量矩形中的字符串,然后检索每个字符索引的 X 和 Y 位置,以便我可以用自己的画笔绘制每个字符。

我尝试单独测量每个字符,但这不起作用,因为字符串中的字符组合与单独测量的每个字符的宽度不同。

编辑: 下面是当我取一个字符串,获取 Region 数组,用红色和蓝色交替填充这些区域,然后尝试在这些区域中绘制每个单独的字符时发生的情况:

我调用 DrawString 如下:

g.DrawString(character, font, brush, region.GetBounds(g));

还尝试了以下方法:

Rectangle bounds = Region.GetBounds(g);
g.DrawString(character, font, brush, new PointF(bounds.Left, bounds.Top));

还有,

g.DrawString(character, font, brush, region.GetBounds(g), stringFormat);

同样的结果。

【问题讨论】:

  • 用gdi+,你可以测量字符串。因此,您可以通过测量切割到该字符的字符串来检查下一个字符必须出现的位置。然后,您可以一个一个地输出字符。或者您可以使用 Graphics.MeasureCharacterRanges 来获取每个字符的位置
  • 我尝试过使用 MeasureCharacterRanges,但我似乎无法使用这些区域绘制每个字符。如果我在应该进入的区域中使用 DrawString 绘制每个字符,则该区域太小并且会剪切字符。
  • 用我的结果编辑了我的问题。

标签: c# gdi+ drawstring


【解决方案1】:

GDI+ 的 DrawString 正在填充结果,它解释了你得到的左侧偏移量。

尝试使用 GDI 来测量字符串。幸运的是,这是已实现的,并且可以通过 TextRenderer() 对象 f.ex 从 .Net 轻松访问:

Size sz = TextRenderer.MeasureText(character, 
                                   font, 
                                   new Point(Integer.MaxValue, Integer.MaxValue),
                                   TextFormatFlags.NoPadding);

您也可以查看TextRenderer.DrawText()

当然,您可以随时修改您的 StringFormat 实例以使用中心对齐和 DrawString 使用矩形而不是点。

StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
Rectangle cr = new Rectangle(x, y, w, h); //same as the colored region
g.DrawString(character, font, brush, cr, sf);

希望这会有所帮助。

【讨论】:

  • 在 MeasureCharacterRanges 提供的矩形中绘制每个字符时,我使用了 StringAlignment.Center,效果很好。
猜你喜欢
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多