我对这两种方法感到困惑。
我的理解是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%”。
当我放置时,
Console.WriteLine(String.Format("{0:0.0%}", value));
在我的print方法中,值以正确的格式打印(例如:75.0%),所以我很确定问题出在Graphics.DrawString()中。
答案 0 :(得分:2)
这似乎与Graphics.DrawString
或TextRenderer.DrawString
或Console.Writeline
没有任何关系。
您提供的格式说明符{0.0%}
不会简单地附加百分号。根据MSDN文档here,%
自定义说明符...
导致数字在格式化之前乘以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();
}
}
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);
}
}