在.NET中绘制文本

Dan*_*lba 16 .net c# drawing gdi+ drawstring

我正在做一些关于在.Net中绘制文本的测试,我得到了以下结果.

绘图文本示例

所有情况都使用默认的Windows Vista/7字体:Segoe UI,9

如您所见,第二个字符串与其他字符串之间存在差异(质量较差,反别名不同).我试图在对象中配置反别名和平滑模式Graphics,没有任何结果.

是否可以绘制文本,Graphics.DrawString并获得与其他方法相同的质量?

提前致谢.


编辑:我已经使用Reflector审查了代码.我意识到Graphics.DrawString使用gdiplus.dll调用方法GdipDrawString()并TextRenderer.DrawText使用user32.dll调用DrawTextExWDrawTextExA.

有什么评论吗?

Han*_*ant 14

GDI +是微软首次尝试渲染分辨率独立文本.并且是在.NET 1.x中呈现文本的唯一方法.它因质量问题而被广泛宣传,鼓励在.NET 2.0中引入TextRenderer和Application.SetCompatibleTextRenderingDefault().它使用GDI绘制文本,有效地解决问题.您应该只在高分辨率设备上使用Graphics.DrawString().打印机.

Fwiw,第二次尝试是WPF,它也有很多模糊文本问题.解决了.NET 4.

试试这个示例表单,看看最糟糕的问题之一:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", 
            this.Font, Brushes.Black, 0, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)


Abb*_*bas 11

以下代码来自MSDN上的示例:

var fontFamily = new FontFamily("Times New Roman");
var font = new Font(fontFamily, 32, FontStyle.Regular, GraphicsUnit.Pixel);
var solidBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString("Your Text Here", font, solidBrush, new PointF(10, 60));
Run Code Online (Sandbox Code Playgroud)

我测试了它并且工作正常,在我的表单上绘制了一个流畅的文本!;)这是文章的链接.

  • 好的,有一点点区别,但如果您使用“TextRenderingHint.AntiAliasGridFit”,则质量是相同的。我用标签复制了我的例子来检查结果!:) (2认同)