2009-02-13 40 views

Respuesta

11

Este artículo: How to embed a true type font muestra cómo hacer lo que pregunta en .NET.

Cómo incrustar una fuente True Type

Algunas aplicaciones, por razones de estética o una requerido estilo visual , se incrustar algunas fuentes comunes de manera que siempre están ahí cuando sea necesario, independientemente de si la fuente está realmente instalada en el sistema de destino.

El secreto de esto es doble. Primero, la fuente debe colocarse en los recursos agregándola a la solución y marcándola como un recurso incrustado . En segundo lugar, en el tiempo de ejecución, la fuente se carga a través de una secuencia y se almacena en un objeto PrivateFontCollection para su uso posterior.

Este ejemplo utiliza una fuente que es poco probable que esté instalada en su sistema . Alpha Dance es una fuente True Type gratuita que está disponible en , la colección de fuentes gratuitas. Esta fuente se incrustó en la aplicación agregándola a la solución y seleccionando la acción de compilación "recurso incrustado" en las propiedades.

Figure 1. The Alpha Dance font file embedded in the solution.

vez que el archivo se ha incluido con éxito en los recursos que necesita para proporcionar un objeto PrivateFontCollection en la que almacenarlo y un método por el cual se carga en la colección. El mejor lugar para hacer es probablemente la excepción de carga de formulario o controlador de eventos. La siguiente lista de muestra el proceso. Observe cómo se usa el método AddMemoryFont . Requiere un puntero a la memoria en la que la fuente es guardada como una matriz de bytes. En C# podemos usar la palabra clave insegura para la conveniencia , pero VB debe usar las capacidades de las clases Marshal manejo de memoria no administrada. La última opción está, por supuesto, abierta a los programadores de C# a los que simplemente no les gusta la palabra clave insegura. PrivateFontCollection pfc = new PrivateFontCollection();

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("embedfont.Alphd___.ttf"); 

    byte[] fontdata = new byte[fontStream.Length]; 
    fontStream.Read(fontdata,0,(int)fontStream.Length); 
    fontStream.Close(); 
    unsafe 
    { 
    fixed(byte * pFontData = fontdata) 
    { 
     pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length); 
    } 
    } 
} 

Fuentes pueden tener sólo ciertos estilos que están disponibles y por desgracia, la selección de un estilo de fuente que no existe va a lanzar una excepción .Para solucionar esto, la fuente se puede interrogar para ver qué estilos de están disponibles y solo se pueden usar los que proporciona la fuente. El siguiente listado demuestra cómo la fuente Alpha Dance es utilizada por comprobando los estilos de fuente disponibles y mostrando todos los que existen. Tenga en cuenta que los estilos de subrayado y tachado son pseudo styles construidos por el motor de representación de fuente y no se proporcionan en realidad en forma de glifo.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    bool bold=false; 
    bool regular=false; 
    bool italic=false; 

    e.Graphics.PageUnit=GraphicsUnit.Point; 
    SolidBrush b = new SolidBrush(Color.Black); 

    float y=5; 

    System.Drawing.Font fn; 

    foreach(FontFamily ff in pfc.Families) 
    { 
    if(ff.IsStyleAvailable(FontStyle.Regular)) 
    { 
     regular=true; 
     fn=new Font(ff,18,FontStyle.Regular); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    if(ff.IsStyleAvailable(FontStyle.Bold)) 
    { 
     bold=true; 
     fn=new Font(ff,18,FontStyle.Bold); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    if(ff.IsStyleAvailable(FontStyle.Italic)) 
    { 
     italic=true; 
     fn=new Font(ff,18,FontStyle.Italic); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    if(bold && italic) 
    { 
     fn=new Font(ff,18,FontStyle.Bold | FontStyle.Italic); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    fn=new Font(ff,18,FontStyle.Underline); 
    e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
    fn.Dispose(); 
    y+=20; 
    fn=new Font(ff,18,FontStyle.Strikeout); 
    e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
    fn.Dispose(); 
    } 

    b.Dispose(); 
} 

Figura 2 muestra la aplicación en acción.

Figure 2. The embedded Alpha Dance font.

Ver el controlador de eventos Form1_Paint, se muestra específicamente cómo configurar el tipo System.Drawing.Font. Se basa en el uso de la clase System.Drawing.Text.PrivateFontCollection.

Espero que esto ayude.

+6

Por favor, edite su respuesta. El enlace está muerto. – Odys

3

Utilice la función de API AddFontResourceEx a través de p/invoke, pasando FR_PRIVATE para evitar la instalación de una fuente global. Entonces debería poder pasar el nombre de la fuente al constructor de la Font como de costumbre.

Editar: Si usa PrivateFontCollection y carga la fuente desde un archivo externo, ni siquiera necesita esto. Si carga la fuente desde un recurso incrustado, use la solución de Ash.

+1

¿Hay algún ejemplo en algún lugar? Realmente puedo entender el enlace de MSDN. Gracias por tu ayuda. – kthakore

Cuestiones relacionadas