我想知道在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() );
}
}
}
lfPitchAndFamily
无效(始终为零),而(lf.lfPitchAndFamily ^ 1)
出现错误(CS0029:无法隐式将类型 'int' 转换为 'bool'
)。 - Doc