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

Foi útil?

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:

enumerar fontes

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top