2011-01-02 12 views
16

Questo mi sta facendo impazzire tutto il giorno.Ottieni un nome di font basato su Nome carattere e Stile (Grassetto/Corsivo)

Ho bisogno di ottenere un nome di file (ad esempio Arial.ttf) in base al suo nome (Arial in questo caso) e se è in grassetto, in corsivo o entrambi. Usando queste informazioni, ho bisogno di trovare il file del font in modo da poterlo usare per il rendering.

Alcuni altri esempi:

  • Calibri, Bold risolverebbero a calibrib.ttf.
  • Calibri, il corsivo si risolve in calibrii.ttf.

Tutte le idee su come avrei potuto raggiungere questo obiettivo in C++ (Win32)

+0

Se si dispone dell'handle HFONT del font, è possibile provare la mia [soluzione proposta] (http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font- gestire-HFONT). Non volevo aggiungere la risposta qui, perché la domanda non è chiara se hai un handle per il carattere o meno. –

risposta

10

In primo luogo, a mia conoscenza, non v'è alcun modo affidabile per farlo.

L'API di Windows si occupa di famiglie di font e mappature, non di file di font, che vengono gestiti a un livello inferiore. Si noti inoltre che anche se si riesce a ottenere il nome del file di un font, nessuna funzione di rendering (che io sappia) lo accetterà, quindi cosa farai con esso?

Detto questo, è possibile cercare nella chiave di registro HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts per ottenere il nome file di un font dal suo nome logico. Un'implementazione di tale soluzione può essere trovata here.

+6

Ho bisogno del nome del file del font perché sto usando FreeType per rendere il font, e FreeType accetta solo un nome file. – Brad

+1

Questa mappatura non funziona quando il sistema operativo è in un'altra lingua. Il nome del file che si ottiene da EnumFontFamiliesExW è la lingua del sistema operativo (ad esempio: 안상수 2006 굵은) mentre il nome del registro è sempre in inglese (ad esempio: ahn2006-B (TrueType)). Microsoft sembra fare passi aggiuntivi durante la mappatura del nome del volto al file di font effettivo. –

0

Una soluzione sarebbe accedere ai file di caratteri ed estrarre il nome dalla tabella dei nomi per creare la propria ricerca (una mappa STL sarebbe un modo semplice per farlo). Dettagli del formato di file TTF possono essere trovati here.

+0

Questo è quello che ho fatto con la libreria di FreeType. Sto iterando tutti i file di font in% WINDIR%/Fonts Poi posso controllare il loro tipo di faccia e il meteo in grassetto/corsivo o entrambi. Il problema è che la directory Fonts contiene file che FreeType ha problemi di lettura, il che fa sì che FreeType sputi gli errori. – Brad

1

Si esegue normalmente chiamando CreateFontIndirect e quindi si esegue il rendering del sistema. Forse potresti spiegare perché non puoi usare questo approccio standard.

2

Questo Code Project project fa quello che vuoi. Così come non funziona su Windows 7 perché la funzione GetWinVer si ferma su XP. E 'banale aggiungere il caso di Windows 7.

1

correlati ai post precedenti, questo sembra essere un modo affidabile:

1) Leggere l'elenco dei caratteri di Windows registrati da HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Fonts \ Qui si ottengono i nomi dei file e i percorsi dei file alternativi. I nomi dei caratteri non sono utili in quanto possono cambiare con le impostazioni locali dell'utente.

2) Caricare i file TrueType (.ttf, .ttc, .otf): Utilizzare FreeType https://www.freetype.org/). Basta inizializzare la libreria freetype e caricare la faccia con FT_New_Face (libreria, percorso, 0, & faccia).

3) Ottenere il nome della famiglia di font utilizzando FreeType. Utilizzare FT_Get_Sfnt_Name_Count() e FT_Get_Sfnt_Name() per ottenere la tabella di stringhe. È necessario verificare se la codifica è Ansi, UTF16 o altro, poiché alcune stringhe saranno in più lingue e codifiche diverse.

4) Ottenere le proprietà TrueType OS2. Utilizzare (TT_OS2 *) FT_Get_Sfnt_Table (face, ft_sfnt_os2) per ottenere la struttura OS2. Interpretare la struttura utilizzando documenti come https://www.microsoft.com/typography/otspec/os2.htm#fc

5) Ora sono disponibili il percorso del file di font, il nome della famiglia, le proprietà di stile e altre informazioni. Crea un elenco di questi e la funzione per cercare un file basato sulla famiglia e lo stile dei font.

Problemi correlati