Como faço para obter todas as fontes de largura fixa instalados?
Pergunta
Eu estou querendo saber se existem maneiras simples para obter uma lista de todos de largura fixa (monoespaçada) fontes instaladas no sistema de um usuário em C #?
Eu estou usando NET 3.5 assim que tem acesso ao namespace WPF System.Windows.Media e LINQ para obter informações de fonte, mas não tenho certeza do que eu estou procurando.
Eu quero ser capaz de fornecer uma lista filtrada de fontes monoespaçadas e / ou escolher fontes monoespaçadas a partir de uma lista maior de fontes (como pode ser visto na janela de opções VS).
Solução
Tenha um olhar em:
http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html
Use uma das estruturas em lá, então loop sobre as famílias, instanciar um Font, e recebendo o valor LogFont e verificar lfPitchAndFamily.
O código a seguir é escrito na mosca e não testado, mas algo como o seguinte deve funcionar:
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......
}
}
}
Outras dicas
Infelizmente ToLogFont função não preencher lfPitchAndFamily para os valores corretos. No meu caso é sempre 0.
Uma aproximação para detectar as fontes que pode ser corrigido é o seguinte
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() );
}
}
}
Tenha em mente que eles são vários falsos positivos, por exemplo, Wingdings
AFAIK você não pode fazê-lo usando apenas bibliotecas BCL. Você tem que usar WinAPI interop.
Você precisa analisar 2 menores pedaços de LOGFONT membro .lfPitchAndFamily. Há uma constante FIXED_PITCH (meio que é fonte de largura fixa) que pode ser usado como uma máscara de bits para lfPitchAndFamily.
Aqui está um artigo útil:
fontes Enumerar pode ser um pouco confundindo, ea menos que você quiser enumerar todas as fontes em seu sistema, pode ser um pouco mais difícil do que MSDN sugere. Este artigo irá explicar exatamente os passos que você precisa usar para encontrar cada fonte de tamanho fixo em seu sistema, e também enumerar todos os tamanho possível para cada indivíduo fonte.