Pregunta

Me he encontrado con problemas en numerosas ocasiones de los usuarios no tener una de las fuentes principales de Windows instalados en su máquina (Courier New, Comic Sans MS, por ejemplo, Arial). Siempre que intento de construir uno de estos se emite un error en lugar de caer de nuevo en un relacionado, o en realidad, cualquier otra fuente.

¿Cuál es la mejor manera de construir una fuente si me gustaría que sea Courier, pero no estoy casado particularmente a ella?

¿Fue útil?

Solución

Puede incrustar las fuentes como los recursos y el uso de la palabra clave unsafe (y debe ser compilado con 'insegura') para obtener las fuentes ... Aquí hay un ejemplo de código que he utilizado para establecer un control de usuario a la fuente del tipo ' OCR '

private PrivateFontCollection pfc = new PrivateFontCollection();
private Font _fntOCRFont = null;
private enum FontEnum{
   OCR = 0
};

Esto declara una colección privada de fuentes ... la fuente 'OCR' se incrusta como un recurso utilizando la convención de nomenclatura donde 'foo' es un espacio de nombres, de ahí el nombre de recurso sería 'foo.ocraext.ttf' .. .Look en 'InitOCRFont' aquí, que carga la fuente y lo añade a la colección:

private void InitOCRFont(){
   try{
      System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf");
      if (streamFont != null){
          byte[] fontData = new byte[streamFont.Length];
          streamFont.Read(fontData, 0, (int)streamFont.Length);
          streamFont.Close();
          unsafe{
                fixed(byte *pFontData = fontData){
                   this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length);
                }
          }
      }else{
          throw new Exception("Error! Could not read built-in Font.");
      }
   }catch(Exception eX){
      throw new Exception("InitOCRFont Method - Exception occurred!\nException was: " + eX.Message);
   }
}

En aquí, ajustar los controles dentro del control del usuario para establecer la fuente para que 'OCR' font por iteración a través de la colección, consulte 'InitializeCtlFont', tamaño de fuente es 10 y es una negrita 'tipo-cara':

private void InitializeCtlFont(){
    this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
    if (this._fntOCRFont != null){
         foreach(Control ctl in this.Controls){
            if (ctl != null && ((ctl is Label) || (ctl is TextBox))){
                        ctl.Font = this._fntOCRFont;
                    }
         }
    }
}

Cuando el usuario obtiene el control dispuestos, es imperativo para liberar los recursos ocupados por la fuente como se muestra aquí en el método Dispose:

try{
   if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}catch{
}
try{
   if (this.pfc != null) this.pfc.Dispose();
}catch{
}

Espero que esta ayuda, Atentamente, Tom.

Otros consejos

Bueno, usted podría utilizar FontFamily.GenericMonospace para obtener a fuente de espacio sencillo, en lugar de específicamente Correo:

Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);

Hay un poco más como fuente genérica familias, así .

También puede utilizar esto como un último recurso después de probar su fuente preferida y funcionando en una excepción.

Esto es muy inusual. El transformador de fuentes de Windows siempre proveerá una fuente de sustitución cuando el programa solicita una fuente que no está disponible en la máquina objetivo. Esa fuente de sustitución por lo general será Microsoft Sans Serif en XP, Segoe UI en versiones posteriores. Ninguno de los que nunca debe causar un problema.

Por otra parte, si la máquina está tan mal estado que no tiene las fuentes básicas disponibles, puede ser que no tienen fuente TrueType disponibles en absoluto. Sí, que bombardeen su programa. Francamente, esto no es algo que debe tener para hacer frente, a no ser que se trata de un cliente muy valioso. Se lo contrario trivialmente resuelto por el equipo de apoyo de su cliente.

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