Как получить все установленные шрифты фиксированной ширины?

StackOverflow https://stackoverflow.com/questions/224865

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне интересно, есть ли какие-нибудь простые способы получить список всех шрифтов фиксированной ширины (моноширинных), установленных в системе пользователя в 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.

Вам необходимо проанализировать 2 младших бита из Член LOGFONT .lfPitchAndFamily. Существует константа FIXED_PITCH (означает, что шрифт имеет фиксированную ширину), которую можно использовать в качестве битовой маски для lfPitchAndFamily.

Вот полезная статья:

Перечисление шрифтов

  

Перечислять шрифты можно немного   сбивает с толку, и если вы не хотите   перечислить все шрифты в вашей системе,   может быть немного сложнее, чем   MSDN предлагает. Эта статья будет   объяснить, какие именно шаги вам нужно   используйте, чтобы найти каждый шрифт фиксированной ширины на   ваша система, а также перечислять каждый   возможный размер для каждого человека   шрифт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top