2009-02-17 10 views
22

Este es probablemente el territorio novato, pero qué diablos:Cómo integrar rápida y fácilmente fuentes en winforms aplicación en C#

Quiero incrustar fuentes en mi aplicación WinForms para que yo no tenga que preocuparse de ellos siendo instalado en la máquina. He buscado un poco en el sitio de MSDN y he encontrado algunos consejos sobre el uso de llamadas nativas a la API de Windows, por ejemplo, el tutorial de Michael Caplans (sp?) Vinculado por Scott Hanselman. Ahora, ¿realmente tengo que pasar por todos esos problemas? ¿No puedo usar la parte del recurso de mi aplicación?

Si no, probablemente seguiré la ruta de instalación. En ese caso, ¿puedo hacerlo programáticamente? ¿Simplemente copiando el archivo de fuente a la carpeta Windows \ Fonts?

Editar: Estoy consciente de los problemas con las licencias, gracias por la preocupación.

+2

Puede hacerlo, pero también tenga en cuenta que, al igual que las fuentes de software, también tienen licencias y debe asegurarse de no violar ninguna licencia que prohíba la incorporación e implementación. – Rad

Respuesta

1

¿No puedo usar la parte del recurso de mi aplicación?

Sí, pero deben ser recursos nativos en lugar de recursos .NET (es decir, utilizando rc.exe, el compilador de recursos nativos).

4
// specify embedded resource name 
string resource = "embedded_font.PAGAP___.TTF"; 

// receive resource stream 
Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource); 

// create an unsafe memory block for the font data 
System.IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length); 

// create a buffer to read in to 
byte[] fontdata = new byte[fontStream.Length]; 

// read the font data from the resource 
fontStream.Read(fontdata, 0, (int)fontStream.Length); 

// copy the bytes to the unsafe memory block 
Marshal.Copy(fontdata, 0, data, (int)fontStream.Length); 

// pass the font to the font collection 
private_fonts.AddMemoryFont(data, (int)fontStream.Length); 

// close the resource stream 
fontStream.Close(); 

// free up the unsafe memory 
Marshal.FreeCoTaskMem(data); 
28

Esto es lo que funcionó para mí en VS 2013, sin tener que usar un bloque inseguro.

Insertar el recurso

  1. doble clic Resources.resx, y en la barra de herramientas para el diseñador, haga clic en Agregar recurso/Agregar archivo existente y seleccione el archivo .ttf
  2. En el explorador de soluciones, haga clic derecho en su archivo .ttf (ahora en una carpeta de Recursos) y vaya a Propiedades. Establecer la Acción de generación de "Recurso incrustado"

cargar la fuente en la memoria

  1. Añadir using System.Drawing.Text; a su archivo Form1.cs

  2. Añadir un código arriba y dentro de su constructor por defecto para crear la fuente en la memoria (sin usar "inseguro" como otros ejemplos han mostrado). A continuación se muestra la totalidad de mis Form1.cs:

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    using System.Reflection; 
    
    using System.Drawing.Text; 
    
    namespace WindowsFormsApplication1 
    { 
        public partial class Form1 : Form 
        { 
         [System.Runtime.InteropServices.DllImport("gdi32.dll")] 
         private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, 
          IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts); 
    
         private PrivateFontCollection fonts = new PrivateFontCollection(); 
    
         Font myFont; 
    
         public Form1() 
         { 
          InitializeComponent(); 
    
          byte[] fontData = Properties.Resources.MyFontName; 
          IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length); 
          System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length); 
          uint dummy = 0; 
          fonts.AddMemoryFont(fontPtr, Properties.Resources.MyFontName.Length); 
          AddFontMemResourceEx(fontPtr, (uint)Properties.Resources.MyFontName.Length, IntPtr.Zero, ref dummy); 
          System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr); 
    
          myFont = new Font(fonts.Families[0], 16.0F); 
         } 
        } 
    } 
    

usa tu fuente

  1. Agregar una etiqueta al formulario principal, y añadir un evento de carga para establecer la fuente en Form1. CS:

    private void Form1_Load(object sender, EventArgs e) 
    { 
        label1.Font = myFont; 
    } 
    
+0

Esto no funciona para mí. Mi fuente no aparece en 'Propiedades.Recursos'. –

+0

@JamesDonnelly No está destinado a aparecer en 'Propiedades.Recursos'. Hay una carpeta separada llamada 'Resources' que se crea en la raíz del proyecto cuando se importa el recurso. – Pyroglyph

0

arrastré y se cayó un randomly downloaded font en mis recursos y esto funcionó. Utiliza un archivo sin embargo. ¿Supongo que puedes usar esto también para instalar fuentes?

public Form1() 
{ 
    string filename = @"C:\lady.gaga"; 
    File.WriteAllBytes(filename, Resources.KBREINDEERGAMES); 
    PrivateFontCollection pfc = new PrivateFontCollection(); 
    pfc.AddFontFile(filename); 

    Label label = new Label(); 
    label.AutoSize = true; 
    label.Font = new Font(pfc.Families[0], 16); 
    label.Text = "hello world"; 
    Controls.Add(label); 
} 
Cuestiones relacionadas