Come posso ottenere tutti i caratteri a larghezza fissa installati?
Domanda
Mi chiedo se ci sono modi semplici per ottenere un elenco di tutti i caratteri a larghezza fissa (monospaziati) installati sul sistema di un utente in C #?
Sto usando .net 3.5, quindi ho accesso allo spazio dei nomi WPF System.Windows.Media e LINQ per ottenere informazioni sui caratteri, ma non sono sicuro di cosa sto cercando.
Voglio essere in grado di fornire un elenco filtrato di caratteri a spaziatura fissa e / o selezionare caratteri a spaziatura fissa da un elenco più ampio di caratteri (come mostrato nella finestra di dialogo Opzioni VS).
Soluzione
Dai un'occhiata a:
http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html
Usa una delle strutture lì dentro, quindi passa in rassegna le famiglie, crea un'istanza di un carattere e ottieni il valore LogFont e controlla lfPitchAndFamily.
Il seguente codice è scritto al volo e non testato, ma qualcosa di simile al seguente dovrebbe funzionare:
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......
}
}
}
Altri suggerimenti
Purtroppo la funzione ToLogFont non riempie il campo lfPitchAndFamily per correggere i valori. Nel mio caso è sempre 0.
Un'approssimazione per rilevare quali caratteri potrebbero essere corretti è la seguente
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() );
}
}
}
Tieni presente che sono diversi falsi positivi, ad esempio Wingdings
AFAIK non puoi farlo usando solo le librerie BCL. Devi usare WinAPI interop.
Devi analizzare 2 bit più bassi di LOGFONT .lfPitchAndFamily member. Esiste una costante FIXED_PITCH (significa che il carattere è a larghezza fissa) che può essere utilizzato come maschera di bit per lfPitchAndFamily.
Ecco un articolo utile:
L'enumerazione dei caratteri può essere un po ' confuso, e se non lo si desidera enumera tutti i caratteri sul tuo sistema, può essere un po 'più difficile di MSDN suggerisce. Questo articolo lo farà spiegare esattamente i passaggi necessari utilizzare per trovare tutti i caratteri a larghezza fissa su il tuo sistema e anche elencare ogni dimensione possibile per ogni individuo font.