C# Graphics.DrawString()与textrender.DrawText()的比较

C# Graphics.DrawString()与textrender.DrawText()的比较,c#,drawstring,C#,Drawstring,我对这两种方法感到困惑 我的理解是Graphics.DrawString()使用GDI+,是一个基于图形的实现,而textrender.DrawString()使用GDI,允许多种字体,并支持unicode 我的问题是,当我试图将十进制数字作为百分比打印到打印机上时。我的研究让我相信文本渲染器是一种更好的方式 但是,MSDN建议,“TextRenderer的DrawText方法不支持打印。您应该始终使用Graphics类的DrawString方法。” 我要使用Graphics.DrawStrin

我对这两种方法感到困惑

我的理解是Graphics.DrawString()使用GDI+,是一个基于图形的实现,而textrender.DrawString()使用GDI,允许多种字体,并支持unicode

我的问题是,当我试图将十进制数字作为百分比打印到打印机上时。我的研究让我相信文本渲染器是一种更好的方式

但是,MSDN建议,“TextRenderer的DrawText方法不支持打印。您应该始终使用Graphics类的DrawString方法。”

我要使用Graphics.DrawString打印的代码是:

if (value != 0)
    e.Graphics.DrawString(String.Format("{0:0.0%}", value), GetFont("Arial", 12, "Regular"), GetBrush("Black"), HorizontalOffset + X, VerticleOffset + Y);
对于0到1之间的数字,打印“100%”;对于零以下的数字,打印“-100%”

当我放置

Console.WriteLine(String.Format("{0:0.0%}", value));

在我的print方法中,值以正确的格式打印(例如:75.0%),因此我非常确定问题出在Graphics.DrawString()中。

这似乎与
Graphics.DrawString
TextRenderer.DrawString
Console.Writeline
没有任何关系

您提供的格式说明符,
{0.0%}
,不只是附加一个百分号。根据MSDN文档,
%
自定义说明符

使数字在格式化之前乘以100

在我的测试中,当传递相同的值和格式说明符时,
Graphics.DrawString
Console.WriteLine
都表现出相同的行为

Console.WriteLine
测试:

class Program
{
    static void Main(string[] args)
    {
        double value = .5;
        var fv = string.Format("{0:0.0%}", value);
        Console.WriteLine(fv);
        Console.ReadLine();
    }
}
图形.抽绳
测试:

public partial class Form1 : Form
{
    private PictureBox box = new PictureBox();

    public Form1()
    {
        InitializeComponent();
        this.Load += new EventHandler(Form1_Load);
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        box.Dock = DockStyle.Fill;
        box.BackColor = Color.White;

        box.Paint += new PaintEventHandler(DrawTest);
        this.Controls.Add(box);
    }

    public void DrawTest(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        double value = .5;
        var fs = string.Format("{0:0.0%}", value);
        var font = new Font("Arial", 12);
        var brush = new SolidBrush(Color.Black);
        var point = new PointF(100.0F, 100.0F);

        g.DrawString(fs, font, brush, point);
    }
}

似乎有点奇怪。DrawString不应该知道任何类型的格式,因为String.Format只返回字符串。您可能需要尝试以下几项:-在visual studio中,在e.Graphics行上断开,突出显示String.Format()参数,然后按Shift-F9查看返回的内容。或者暂时用文字代替格式(即100.0%")查看DrawString是否以不同的方式处理它。此行为听起来像是将
value
视为一个整数。我建议将您的字符串拆分。将其格式化为单独的字符串变量,以便您可以在Graphics.DrawString上设置断点,并在调试期间检查值的内容和结果字符串。我严重怀疑这是Graphics.DrawString做的。