¿Cómo consigo todas las fuentes instaladas de ancho fijo?
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).
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
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:
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.