Graphics.DrawString()与TextRenderer.DrawText()比较

7

我对这两种方法感到困惑。

我的理解是,Graphics.DrawString()使用GDI+实现,基于图形,而TextRenderer.DrawString()使用GDI并允许使用大范围字体和支持Unicode。

我的问题是当我尝试将十进制数字打印为百分比时。我的研究表明TextRenderer是更好的选择。

然而,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%”。以下是需要翻译的内容:

When I place,

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

在我的打印方法中,值以正确的格式(例如:75.0%)打印出来,因此我相信问题在于Graphics.DrawString()。


4
似乎有点奇怪。DrawString不应该意识到任何格式,因为String.Format只是返回一个字符串。你可能想尝试几件事:-在Visual Studio中,在e.Graphics行上中断,突出显示String.Format()参数并按Shift-F9查看返回值。或者暂时用文字替代格式(例如“100.0%”),看看DrawString是否会以不同的方式处理。 - MutantNinjaCodeMonkey
1
这种行为听起来像是value被当作整数处理了。我建议将您的String.Format拆分成一个单独的字符串变量,以便您可以在Graphics.DrawString上设置断点,并在调试期间检查value和生成的字符串的内容。我非常怀疑这是由Graphics.DrawString引起的。 - JamieSee
1个回答

2
这似乎与Graphics.DrawStringTextRenderer.DrawStringConsole.Writeline无关。您提供的格式说明符{0.0%}并不只是简单地附加一个百分号。根据MSDN文档(在此)%自定义说明符会导致数字在格式化之前被乘以100。在我的测试中,当传递相同的值和格式说明符时,Graphics.DrawStringConsole.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();
    }
}

Graphics.DrawString 测试:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接