自定义字体渲染质量差

时间:2015-11-30 22:23:24

标签: c# .net winforms fonts rendering

我在winform应用程序中将ttf文件中的字体加载到PrivateFontCollection。然后我将字体应用于表单上的各种元素。

PrivateFontCollection fonts = new PrivateFontCollection();

private void applyFormFonts()
{
    fonts.AddFontFile("fonts\\OpenSans-Light.ttf");
    fonts.AddFontFile("fonts\\OpenSans-Regular.ttf");

    /// get font family references
    FontFamily openSans = fonts.Families.First(f => f.Name.Equals("Open Sans"));
    FontFamily openSansLight = fonts.Families.First(f => f.Name.Equals("Open Sans Light"));

    /// configure fonts for form components
    this.label1.Font = new Font(openSans, this.label1.Font.Size);
    this.label2.Font = new Font(openSans, this.label2.Font.Size);
    this.textbox1.Font = new Font(openSans, this.textbox1.Font.Size);
    this.button1.Font = new Font(openSansLight, this.button1.Font.Size);
}

在所有情况下,字体加载并应用于所需元素。当我在已经安装了Windows字体的系统上测试表单时,表单看起来很完美。

但是,当我在没有安装表单的系统上测试表单时,字体显示的质量非常差!边缘粗糙,各处的像素都缺失。

我尝试过使用UseCompatibleTextRendering属性,该属性可用于某些元素(不是文本框),这样可以改善一些事情。但为什么差别呢!如何使这些字体渲染得很好?我可以更改Form本身的渲染设置吗?

修改:使用方法here的建议并非完全工作。我试图创建一个字体:

Font openSans16 = new Font(openSans, 16, FontStyle.Regular, GraphicsUnit.Point);

并将其应用于winforms标签:

this.label1.Font = openSans16;

文本的渲染质量与之前相同。如果字体已经存在于系统中,那么质量很好,但是没有安装它的系统很差。

我还尝试使用Graphics.DrawString()在Paint事件处理程序中绘制一个字符串:

private void AlertForm_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.PageUnit = GraphicsUnit.Point;

    SolidBrush brush = new SolidBrush(Color.Black);
    e.Graphics.DrawString("Test String", openSans16, brush, 120, 100);
}

结果再次相同。然后在Paint事件处理程序中我尝试添加:

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

结果太棒了!完全正常的文字。但直接这样做意味着我必须对表格上的所有字符串使用DrawString(),包括多行文本框等。

如何更改TextRenderingHint以呈现标签和文本框?

0 个答案:

没有答案