2008-10-22 15 views
13

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#?¿Cómo obtengo todas las fuentes de ancho fijo instaladas?

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.

Deseo 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 cuadro de diálogo Opciones de VS).

Respuesta

11

Tenga una mirada en:

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

Utilice una de las estructuras de allí, a continuación, un bucle sobre las familias, crear instancias de una fuente, y obtener el valor LOGFONT y comprobando lfPitchAndFamily.

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

'lfPitchAndFamily' doesn 't work (siempre cero) y '(lf.lfPitchAndFamily^1)' da un error ('CS0029: no se puede convertir implícitamente el tipo' int 'a' bool'') – Doc

5

AFAIK no puede hacerlo solo con las bibliotecas BCL. Tienes que usar la interoperabilidad de WinAPI.

Necesita analizar 2 bits más bajos de LOGFONT .lfPitchAndFamily member. 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í es un artículo útil:

fuentes enumeración puede ser un poco confuso, ya menos que usted quiere enumerar todas las fuentes en su sistema, puede ser un poco más difícil que sugiere MSDN. Este artículo será , explique exactamente los pasos que necesita para usar para encontrar cada fuente de ancho fijo en su sistema, y ​​también enumere cada tamaño posible para cada fuente individual .

6

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

Una aproximación para detectar las fuentes que podrían ser fijos es el 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

+0

0 es un valor" correcto ". Significa 'DEFAULT_PITCH'. –

+0

Demasiado _hacky_ y propenso a falsos positivos (como mencionaste) :( – Doc

Cuestiones relacionadas