当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何获得所有已安装的固定宽度字体?》经验,为你挑选了3个好方法。

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

我正在使用.net 3.5,因此可以访问WPF System.Windows.Media命名空间和LINQ来获取字体信息,但我不确定我在寻找什么.

我希望能够提供等宽字体的过滤列表和/或从更大的字体列表中选择等宽字体(如VS选项对话框中所示).



1> Tim Ebenezer..:

看一下:

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......
        }
    }
}


`lfPitchAndFamily`不起作用(总是为零)和`(lf.lfPitchAndFamily ^ 1)`给出错误(`CS0029:不能隐式地将类型'int'转换为'bool'`)

2> Panos Theof..:

不幸的是,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



3> aku..:

AFAIK你不能只使用BCL库.您必须使用WinAPI互操作.

您需要分析LOGFONT .lfPitchAndFamily成员的2个最低位.有一个常量FIXED_PITCH(表示字体是固定宽度),可以用作lfPitchAndFamily的位掩码.

这是一篇有用的文章:

枚举字体

枚举字体可能有点令人困惑,除非你想枚举系统中的所有字体,否则比MSDN建议的要困难一些.本文将准确解释您在系统中查找每个固定宽度字体所需的步骤,并列出每种字体的每个可能大小.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有