c# - 如何为单个字符着色并保持适当的间距/字偶距/对齐方式?

标签 c# gdi+ drawstring

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

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

考虑到在具有 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);

相同的结果。

最佳答案

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

希望这有帮助。

关于c# - 如何为单个字符着色并保持适当的间距/字偶距/对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13163894/

相关文章:

winforms - 如何在 Windows 窗体中创建 GDI 泄漏!

java - Java SE 中 g.drawString 中的换行和制表符间距

c# - 是否可以使用 C# 检测 xml 节点是否存在?

c# - .Net 等效于 ScaleHeight 和 Scalewidth

.net - 如何将Rectangle转换为RectangleF?

java - 使用 Java Swing,mouseEntered 的光芒被 mouseMoved 所掩盖。有一个简单的解决办法吗?

c# - 如何在精确的像素位置绘制字符串

c# - 上课时不阅读按钮单击时输入的表单

c# - 仅使用 POCO 的项目上的 TypeLite?

c# - 如何在 Windows Vista/7/8 上以编程方式启动 SFC?