C# 自定义字体呈现质量差

C# 自定义字体呈现质量差,c#,.net,winforms,fonts,rendering,C#,.net,Winforms,Fonts,Rendering,我正在将字体从ttf文件加载到winforms应用程序中的PrivateFontCollection。然后,我将字体应用于表单上的各种元素 PrivateFontCollection fonts = new PrivateFontCollection(); private void applyFormFonts() { fonts.AddFontFile("fonts\\OpenSans-Light.ttf"); fonts.AddFontFile("fonts\\OpenSa

我正在将字体从ttf文件加载到winforms应用程序中的
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
属性,该属性可用于某些元素(而不是文本框),这稍微改善了一些情况。但为什么会有这样的差别呢!如何使这些字体呈现得很好?
表单本身是否有可以更改的渲染设置


编辑:使用这种方法的建议不太管用。我尝试创建字体:

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);
}
结果也是一样的。然后在绘制事件处理程序中,我尝试添加:

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


如何更改标签和文本框呈现的
textrendinghint

我看到了类似的问题,但我不确定如何将注释应用到我的情况,如果它们有帮助的话。问题没有回答。请看这里:谢谢@cfrozendath-我已经读过该问题,但我认为我不太理解它如何适用于这个问题。具体来说,您建议我使用其中的哪一部分来修复我的问题?我建议您尝试整个代码。如果您查看已接受答案的结尾,您将看到字体正确呈现(或者看起来像)。我认为这可能对你有用,因为你使用的是TTF文件。他们可能有一些特殊的东西需要所有的工作,但实际上并没有指示如何将这些代码应用于像label和textbox这样的winforms元素,这正是我要做的。相反,它们使用Graphics.DrawString()绘制字符串。我不知道如何从A到B。我看到过类似的问题,但我不知道如何将这些评论应用到我的情况中,如果它们有帮助的话。问题没有回答。请看这里:谢谢@cfrozendath-我已经读过该问题,但我认为我不太理解它如何适用于这个问题。具体来说,您建议我使用其中的哪一部分来修复我的问题?我建议您尝试整个代码。如果您查看已接受答案的结尾,您将看到字体正确呈现(或者看起来像)。我认为这可能对你有用,因为你使用的是TTF文件。他们可能有一些特殊的东西需要所有的工作,但实际上并没有指示如何将这些代码应用于像label和textbox这样的winforms元素,这正是我要做的。相反,它们使用Graphics.DrawString()绘制字符串。不知道如何从A到B。