我在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
以呈现标签和文本框?