代码之家  ›  专栏  ›  技术社区  ›  VolkerK

如何获取所有已安装的固定宽度字体?

  •  14
  • VolkerK  · 技术社区  · 16 年前

    我想知道是否有任何简单的方法来获得所有固定宽度(单空间)字体的列表,这些字体安装在C中的用户系统上?

    我正在使用.NET 3.5,因此可以访问wpf system.windows.media命名空间和linq来获取字体信息,但我不确定要查找什么。

    我希望能够提供单间距字体的过滤列表和/或从更大的字体列表中选择单间距字体(如“vs选项”对话框中所示)。

    3 回复  |  直到 9 年前
        1
  •  13
  •   Tim Ebenezer    16 年前

    看一看:

    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......
            }
        }
    }
    
        2
  •  6
  •   Panos Theof    12 年前

    不幸地 字体字体 函数不填充 LFpitchhand系列 字段以更正值。在我的例子中,总是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

        3
  •  5
  •   Community Egal    9 年前

    afaik不能只使用bcl库。您必须使用winapi interop。

    您需要分析 LOGFONT .lfpitchhand家庭成员。有一个恒定的固定螺距(意味着字体是固定宽度),可以用作lfpitchandfamily的位掩码。

    以下是一篇有用的文章:

    Enumerating Fonts

    枚举字体可能有点 令人困惑,除非你想 枚举系统上的所有字体, 可能比 MSDN建议。这篇文章将 准确解释你需要的步骤 用于查找上的每个固定宽度字体 你的系统,也列举 每个个体的可能大小 字体。