【问题标题】:Drawing string by GDI+ in exactly in specified point通过 GDI+ 在指定点精确绘制字符串
【发布时间】:2013-01-10 06:45:50
【问题描述】:

我在 c# 中绘制字符串时遇到问题

这是我的代码:

Graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
Pen pen = new Pen(brush, 2f);
Font font = new Font("Segoue UI", 15);
graphic.DrawString("2", font, brush, new PointF(0f, 0f));

以前我创建了图片框,并从中做了图形对象。 问题是“2”不是在 (0;0) 中绘制,而是在 (4;5) 中绘制。如果我关闭 AntiAlias 的事件仍在 (4;5) 中。

我通过从 (0;0) 到 (200;0) 和从 (0;0) 到 (0;200) 绘制两条线来检查它,并根据它们计算出绘制字符串中的错误。

任何想法为什么?我需要准确地绘制字符串。

//编辑 我也在尝试以这种方式设置字体:

Font font = new Font("Microsoft Sans Serif", 10);

在(0,0)中画出“2”,“2”的真实位置是(3,3)。与绘图“1”错误相同(3;3)。

【问题讨论】:

标签: c# graphics drawing gdi+


【解决方案1】:

Graphics.DrawString 会自动填充用于绘制字符串的框。原因是它的目的是为控件绘制标签文本等,因此是“现成的”,因此文本周围有填充。

Microsoft 最终意识到,这种方法对于需要更准确的文本绘制(即文本编辑器等)的情况并不是最好的,因此开发了 TextRendered 类,它封装了 GDI 而不是 GDI+ 并提供支持“旧”更准确的字符串绘制。

试试:

TextRenderer.DrawText(e.Graphics, "2", font, new Point(0, 0), brush);

即使这样,您也可能会遇到填充,但在这里您可以更可靠地弥补这一点。检查下面的链接以查看您可以在该方法中使用哪些标志。

注意:如果您需要测量文本,请务必使用 TextRenderer.MeasureText()

更多详情,请转至:
http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.aspx

标志:
http://msdn.microsoft.com/en-us/library/w3cdh3zw.aspx

【讨论】:

  • 感谢您的回复。标记 NoPadding 有效,但仅适用于左侧。所以我正在用指定的字体绘制 tekst,我只是在“手动”检查文本在哪里,然后我正在计算绘图错误。
【解决方案2】:

如果你的“字符串”有一个降序字母,比如 g 或 j,会发生什么?每种字体都允许字母的降序部分,因此您可能需要通过查看字体的指标来考虑这一点

http://msdn.microsoft.com/en-us/library/xwf9s90b.aspx

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 2016-01-13
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    相关资源
    最近更新 更多