2009-09-22 8 views
1

Je me demandais si quelqu'un sait comment faire en sorte que les détails de la version et du copyright proviennent d'une police de type vrai. Si vous l'ouvrez dans l'explorateur ainsi que l'aperçu, vous obtenez cette information dans la visionneuse de polices Windows. Je l'ai regardé la structure LogFont mais l'info ne semble pas être iciObtenir des informations sur les polices dans .net

Vive Luke

Répondre

2

je devais le faire il y a quelques années pour un projet de travail. Je ne peux pas le publier car il est propriétaire, mais la spécification pour les polices TT est here.

J'ai écrit des classes pour la table de décalage, l'enregistrement de nom, l'en-tête de table de nom et les éléments de répertoire de table de sorte que chaque classe ait une méthode FromStream statique.

J'ai aussi écrit une classe utilitaire appelé BigEndianReader pour traiter les données de lecture à partir d'un grand flux ordonné endian, que je suis heureux de mettre ici pour vous rendre la vie plus facile:

public class BigEndianReader 
{ 
    public static bool Read(Stream stm, out uint i) 
    { 
     int bhihi = stm.ReadByte(); 
     if (bhihi == -1) 
     { 
      i = 0; 
      return false; 
     } 
     int bhi = stm.ReadByte(); 
     if (bhi == -1) 
     { 
      i = 0; 
      return false; 
     } 
     int blo = stm.ReadByte(); 
     if (blo == -1) 
     { 
      i = 0; 
      return false; 
     } 
     int blolo = stm.ReadByte(); 
     if (blolo == -1) 
     { 
      i = 0; 
      return false; 
     } 
     i = (uint)((bhihi << 24) | (bhi << 16) | (blo << 8) | blolo); 
     return true; 
    } 

    public static bool Read(Stream stm, out int i) 
    { 
     int bhihi = stm.ReadByte(); 
     if (bhihi == -1) 
     { 
      i = 0; 
      return false; 
     } 
     int bhi = stm.ReadByte(); 
     if (bhi == -1) 
     { 
      i = 0; 
      return false; 
     } 
     int blo = stm.ReadByte(); 
     if (blo == -1) 
     { 
      i = 0; 
      return false; 
     } 
     int blolo = stm.ReadByte(); 
     if (blolo == -1) 
     { 
      i = 0; 
      return false; 
     } 
     i = ((bhihi << 24) | (bhi << 16) | (blo << 8) | blolo); 
     return true; 
    } 


    public static bool Read(Stream stm, out ushort s) 
    { 
     int bhi = stm.ReadByte(); 
     if (bhi == -1) 
     { 
      s = 0; 
      return false; 
     } 
     int blo = stm.ReadByte(); 
     if (blo == -1) 
     { 
      s = 0; 
      return false; 
     } 
     s = (ushort)(((bhi << 8) | blo) & 0xffff); 
     return true; 
    } 

    public static bool Read(Stream stm, out short s) 
    { 
     int bhi = stm.ReadByte(); 
     if (bhi == -1) 
     { 
      s = 0; 
      return false; 
     } 
     int blo = stm.ReadByte(); 
     if (blo == -1) 
     { 
      s = 0; 
      return false; 
     } 
     s = (short)(((bhi << 8) | blo) & 0xffff); 
     return true; 
    } 
} 

Ce n'est pas particulièrement élégant , mais il est assez facile à utiliser:

int val; 

if (!BigEndianReader.Read(stm, out val)) 
    throw new SomeErrorOfSomeKind(); 

J'imagine que si vous avez pris soin assez que vous pouvez faire ce toutes les méthodes d'extension sur le volet et votre pourrait lirait:

int val; 

if(!stm.BERead(out val)) // BE prefix for Big Endian 
    throw new SomeErrorOfSomeKind(); 
+0

merci socle il me donne un point de départ – beakersoft

Questions connexes