如何为单个字符着色并保持适当的间距/字距调整/对齐?

时间:2012-10-31 17:52:33

标签: c# gdi+ drawstring

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

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

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

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

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

修改: 这是当我拿一个字符串,获取Region数组,用红色和蓝色交替填充这些区域,然后尝试在这些区域中绘制每个字符时发生的事情:

enter image description here

我按如下方式调用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);

相同的结果。

1 个答案:

答案 0 :(得分:2)

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

尝试使用GDI来测量字符串。幸运的是,这是通过TextRenderer()对象实现的,很容易从.Net到达,f.ex:

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);

希望这有帮助。