c# wpf fonts monospace

c# - ¿Cómo obtengo todas las fuentes de ancho fijo instaladas?



wpf fonts (3)

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

Una aproximación para detectar qué fuentes se pueden arreglar 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

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

Estoy usando .net 3.5 así que tengo acceso al espacio de nombres WPF System.Windows.Media 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 grande de fuentes (como se ve en el diálogo de opciones VS).


Mira esto:

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

Utilice una de las estructuras que hay allí, luego recorra las familias, crea una instancia de una fuente, y obtenga el valor de LogFont y verifique lfPitchAndFamily.

El siguiente código se escribe sobre la marcha y no se ha probado, 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...... } } }


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

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

Aquí hay un artículo útil:

Enumeración de fuentes

La enumeración de fuentes puede ser un poco confusa y, a menos que desee enumerar todas las fuentes en su sistema, puede ser un poco más difícil de lo que sugiere MSDN. Este artículo explicará exactamente los pasos que debe seguir para encontrar cada fuente de ancho fijo en su sistema, y ​​también enumerará todos los tamaños posibles para cada fuente individual.