我想知道是否有任何简单的方法可以获得安装在C#用户系统上的所有固定宽度(单间距)字体的列表?
我使用的是.net 3.5,因此可以访问WPF System.Windows.Media命名空间和LINQ来获取字体信息,但我不确定我在寻找什么。
我希望能够提供一个经过过滤的单空间字体列表和/或从更大的字体列表中挑选出单空间字体(如VS选项对话框中所示)。
看看:
http://www.pinvoke.net/default.aspx/Structures/LOGFONT.html
使用其中的一个结构,然后在族上循环,实例化一个Font,获取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
AFAIK您不能仅使用BCL库来实现。您必须使用WinAPI互操作。
您需要分析LOGFONT.lfBitchAndFamily成员的2个最低位。有一个常量FIXED_PITCH(意味着字体是固定宽度的),可以用作lfPitchAndFamily的位掩码。
这里有一篇有用的文章:
枚举字体
枚举字体可能有点令人困惑,除非你愿意枚举系统上的所有字体,可能比MSDN建议。这篇文章将准确解释你需要采取的步骤用于查找上的每个固定宽度字体您的系统,并列举每个人的可能尺寸字体。