我想知道是否有任何简单的方法可以在 C# 中获取用户系统上安装的所有固定宽度(等宽)字体的列表?
我正在使用 .net 3.5,因此可以访问 WPF System.Windows.Media 命名空间和 LINQ 以获取字体信息,但我不确定我在寻找什么。
我希望能够提供过滤的等宽字体列表和/或从更大的字体列表中挑选等宽字体(如 VS 选项对话框中所示)。
看一下:
http://www.pinvoke.net/default.aspx/Structures/LOGFONT.html
使用其中的一种结构,然后遍历族,实例化字体,获取 LogFont 值并检查 lfPitchAndFamily。
以下代码是即时编写且未经测试的,但类似以下的代码应该可以工作:
foreach (FontFamily ff in System.Drawing.FontFamily.Families)
{
if (ff.IsStyleAvailable(FontStyle.Regular))
{
Font font = new Font(ff, 10);
LOGFONT lf = new LOGFONT();
font.ToLogFont(lf);
if (lf.lfPitchAndFamily ^ 1)
{
do stuff here......
}
}
}
不幸的是,ToLogFont函数不会填充lfPitchAndFamily字段以更正值。在我的情况下,它始终为 0。
检测哪些字体可能是固定的一种近似值如下
foreach ( FontFamily ff in FontFamily.Families ) {
if ( ff.IsStyleAvailable( FontStyle.Regular ) ) {
float diff;
using ( Font font = new Font( ff, 16 ) ) {
diff = TextRenderer.MeasureText( "WWW", font ).Width - TextRenderer.MeasureText( "...", font ).Width;
}
if ( Math.Abs( diff ) < float.Epsilon * 2 ) {
Debug.WriteLine( ff.ToString() );
}
}
}
请记住,它们是几个误报,例如 Wingdings