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

È stato utile?

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:

Enumerating Fonts

  

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top