2010-03-28 5 views
0

Je viens d'ajouter un fichier ttf au projet (C# 2008 express) en tant que "fichier" et construire l'option à la ressource incorporée.embed ttf comme ressource intégrée: ne peut pas le référencer

Je vais avoir des problèmes en essayant de mettre cette police comme ceci: (je sais la ligne suivante est mal ...)

this.label1.Font = AlarmWatch.Properties.Resources.Baby_Universe; 

Erreur 1 Impossible de convertir implicitement le type « octet [ ] » à 'System.Drawing.Font' C: \ Users \ Hongo \ Documents \ de Visual studio de 2008 \ Projects \ AlarmWatch \ AlarmWatch \ Form1.Designer.cs 57 32 AlarmWatch

Je sais qu'il est byte [] parce que je l'ai mis l'accumulation d'options comme ressource incorporée, mais la comparaison avec cette ligne qui est correcte:

this.label1.Font = new System.Drawing.Font("OCR A Extended", 
          24F, System.Drawing.FontStyle.Regular, 
          System.Drawing.GraphicsUnit.Point, ((byte)(0))); 

Comment puis-je mettre this.label1 utiliser la nouvelle police?

Répondre

2

Il existe une méthode AddMemoryFont dans l'espace de noms System.Drawing.Text, qui charge une police d'une mémoire (il faut un pointeur sur le bloc de mémoire, de sorte que vous aurez besoin de faire une opération dangereuse pour obtenir le pointeur sur votre tableau d'octets - I trouvé example here). En savoir plus sur le method on MSDN.

Il existe également un StackOverflow question qui montre comment importer la fonction Win API pour charger la police directement (dans le cas où la méthode .NET ci-dessus ne fonctionne pas).

EDIT Une traduction de la partie clé de Visual Basic pourrait ressembler à ceci (ont pas vérifié si):

// This should be probably a field of some class 
PrivateFontCollection pfc = new PrivateFontCollection(); 

// allocate memory and copy byte[] to the location 
IntPtr data = Marshal.AllocCoTaskMem(yourByteArray.Length); 
Marshal.Copy(yourFontArray, 0, data, yourFontArray.Length); 

// pass the font to the font collection 
pfc.AddMemoryFont(data, fontStream.Length) 

// Free the unsafe memory 
Marshal.FreeCoTaskMem(data) 

Une fois que vous avez cela, vous devriez être en mesure de se référer à la police en utilisant son nom habituel.

+0

salut, merci pour votre réponse. Je suis allé à cette page, mais, je ne sais pas comment mettre ce code dans mon application, car il est en base visuelle et ne peut pas le traduire bien ... – HoNgOuRu

+0

Comment puis-je définir un message comme répondu ou accepté ou autre? – HoNgOuRu

+0

merci, je vais le faire maintenant! – HoNgOuRu

0
private static void AddFontFromResource(PrivateFontCollection privateFontCollection, string fontResourceName) 
{ 
    var fontBytes = GetFontResourceBytes(typeof (App).Assembly, fontResourceName); 
    var fontData = Marshal.AllocCoTaskMem(fontBytes.Length); 
    Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length); 
    privateFontCollection.AddMemoryFont(fontData, fontBytes.Length); 
    Marshal.FreeCoTaskMem(fontData); 
} 

private static byte[] GetFontResourceBytes(Assembly assembly, string fontResourceName) 
{ 
    var resourceStream = assembly.GetManifestResourceStream(fontResourceName); 
    if (resourceStream == null) 
     throw new Exception(string.Format("Unable to find font '{0}' in embedded resources.", fontResourceName)); 
    var fontBytes = new byte[resourceStream.Length]; 
    resourceStream.Read(fontBytes, 0, (int)resourceStream.Length); 
    resourceStream.Close(); 
    return fontBytes; 
} 
Questions connexes