Pregunta

Me pregunto si hay formas sencillas de obtener una lista de todas las fuentes de ancho fijo (monoespaciadas) instaladas en el sistema de un usuario en C #?

Estoy usando .net 3.5, así que tengo acceso al WPF System.Windows.Media namespace y LINQ para obtener información de fuentes, pero no estoy seguro de lo que estoy buscando.

Quiero poder proporcionar una lista filtrada de fuentes monoespaciadas y / o seleccionar fuentes monoespaciadas de una lista más amplia de fuentes (como se ve en el cuadro de diálogo de opciones de VS).

¿Fue útil?

Solución

Echa un vistazo a:

http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html

Use una de las estructuras allí, luego haga un bucle entre las familias, cree una fuente y obtenga el valor de LogFont y verifique lfPitchAndFamily.

El siguiente código está escrito sobre la marcha y sin probar, pero algo como lo siguiente debería 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......
        }
    }
}

Otros consejos

Desafortunadamente, la función ToLogFont no llena el campo lfPitchAndFamily para corregir los valores. En mi caso siempre es 0.

Una aproximación para detectar qué fuentes podrían ser reparadas es la siguiente

    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() );
                }
            }

        }

Tenga en cuenta que son varios falsos positivos, por ejemplo, Wingdings

AFAIK no puedes hacerlo usando solo bibliotecas BCL. Tienes que usar la interoperabilidad de WinAPI.

Debe analizar los 2 bits más bajos de LOGFONT .lfPitchAndFamily miembro. Hay una constante FIXED_PITCH (significa que la fuente tiene un ancho fijo) que se puede usar como máscara de bits para lfPitchAndFamily.

Aquí hay un artículo útil:

Enumerando fuentes

  

Enumerar fuentes puede ser un poco   confuso, ya menos que quieras   enumere todas las fuentes en su sistema,   puede ser un poco mas dificil que   MSDN sugiere. Este articulo sera   explica exactamente los pasos que necesitas   Utilice para encontrar cada fuente de ancho fijo en   su sistema, y ??también enumerar cada   posible tamaño para cada individuo   fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top