2009-02-17 12 views
22

Questo è probabilmente territorio niubbo ma che diamine:Come rapidamente e facilmente incorporare i caratteri in WinForms applicazione in C#

voglio incorporare i caratteri nella mia applicazione WinForms in modo che non devono preoccuparsi di loro di essere installato sulla macchina. Ho cercato un po 'sul sito MSDN e ho trovato alcuni suggerimenti sull'utilizzo delle chiamate API native di Windows, ad esempio il tutorial di Michael Caplans (sp?) Collegato a Scott Hanselman. Ora, devo davvero passare attraverso tutti questi problemi? Non posso semplicemente usare la parte delle risorse della mia app?

In caso contrario, probabilmente andrò sul percorso di installazione. In tal caso, posso farlo programmaticamente? Copiando semplicemente il file del font nella cartella Windows \ Fonts?

Modifica: Sono a conoscenza di problemi di licenza, grazie per la preoccupazione però.

+2

È possibile farlo, ma è anche necessario tenere presente che anche i caratteri software hanno licenze e che è necessario assicurarsi che non si stiano violando licenze che vietano l'incorporamento e la distribuzione. – Rad

risposta

1

Non è possibile utilizzare solo la parte delle risorse della mia app?

Sì, ma devono essere risorse native anziché risorse .NET (ad esempio utilizzando rc.exe, il compilatore di risorse native).

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

Questo è ciò che ha funzionato per me in VS 2013, senza dover utilizzare un blocco non sicuro.

incorporare la risorsa

  1. doppio clic Resources.resx, e nella barra degli strumenti per il progettista scegliere Aggiungi risorsa/Aggiungi file esistente e selezionare il file .ttf
  2. nella soluzione esploratore, fare clic con il tasto destro del mouse sul file .ttf (ora in una cartella Risorse) e andare su Proprietà. Impostare l'azione di costruzione di "Risorsa incorporata"

caricare il font nella memoria

  1. Aggiungi using System.Drawing.Text; ai tuoi file Form1.cs

  2. Aggiungere codice di sopra e dentro il costruttore di default per creare il font in memoria (senza usare "non sicuro" come hanno mostrato altri esempi). Qui di seguito è tutta la mia 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 il tuo carattere

  1. Aggiungere un'etichetta al form principale, e aggiungere un evento carico di impostare il tipo di carattere in Form1. cs:

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

Questo non funziona per me. Il mio font non appare sotto 'Properties.Resources'. –

+0

@JamesDonnelly Non è pensato per comparire in 'Proprietà.Risorse'. Esiste una cartella separata denominata 'Risorse' che viene creata nella radice del progetto quando si importa la risorsa. – Pyroglyph

0

ho trascinato e lasciato cadere un randomly downloaded font nelle mie risorse e questo ha funzionato. Usa un file però. Immagino che tu possa usare anche questo per installare i caratteri?

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); 
}