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