Pergunta

O que é a melhor maneira de encontrar todas as fontes do sistema que um usuário tem disponível para que eles possam ser exibidos em uma caixa de seleção suspensa?

Eu também gostaria de distinguir entre Unicode e fontes não-Unicode.

Eu estou usando Delphi 2009 que é totalmente Unicode habilitado e gostaria de uma solução Delphi.

Foi útil?

Solução

A propriedade Screen.Fonts é preenchida através do EnumFontFamiliesEx API função . Procurar em Forms.pas para um exemplo de chamar essa função.

A função de retorno de chamada que chama receberá um href="http://msdn.microsoft.com/en-us/library/ms533968.aspx" rel="noreferrer"> TNewTextMetricEx registro TFontSignature . O campo fsUsb indica que Unicode subranges as reivindicações de fonte para apoio.

O sistema não tem realmente "fontes Unicode." Mesmo as fontes que têm a palavra Unicode em seus nomes não têm glifos para todas caracteres Unicode. Você pode distinguir entre bitmap, impressora e fontes TrueType, mas além disso, o melhor que você pode fazer é descobrir se a fonte que você está considerando suporta os caracteres que você deseja. E se a fonte não é o que você consideraria uma "fonte Unicode", mas ele suporta todos os caracteres que você precisa, então que diferença isso faz? Para obter essa informação, você pode estar interessado em GetFontUnicodeRanges .

A tecnologia Microsoft para a exibição de texto com fontes diferentes com base em quais fontes contêm os caracteres que é Uniscribe , particularmente fonte de recurso . Eu não estou ciente de qualquer suporte Delphi para Uniscribe; Eu comecei a escrever um conjunto de unidades de importação de uma vez, mas meus interesses são inconstantes, e me mudei para outra coisa antes de eu completou. Blog Michael Kaplan fala sobre Uniscribe às vezes, de modo que é um outro lugar para olhar.

Outras dicas

Eu posso responder a metade da sua pergunta, você pode obter uma lista dos tipos de letra que o ambiente atual tem acesso a como uma lista de strings do objeto Screen mundial

i.

Listbox1.Items.AddStrings(Screen.Fonts);

Você pode olhar na fonte forms.pas para ver como CodeGear Screen.Fonts preenchimento enumerando as fontes do Windows. A estrutura LOGFONT retornado tem um membro do charset, mas isso não fornece uma simples determinação 'Unicode'.

Tanto quanto eu sei o Windows pode não lhe dizer explicitamente se uma fonte é 'Unicode'. Além disso, se você tentar para exibir o texto Unicode em fonte um 'não-Unicode' Windows pode substituir uma fonte diferente, por isso é difícil dizer se uma fonte irá ou não exibir Unicode. Por exemplo, eu tenho um arquivo de fonte Arial Black antiga, que não contém glifos Unicode, mas se eu usar isso para exibir texto em japonês em um memorando D2009, os shows japoneses corretamente em Arial eo restante em Arial Black. Em outros exemplos, as habituais quadrados vazios podem aparecer.

scroll top