Question

J'ai rencontré des problèmes à de nombreuses reprises d'utilisateurs de ne pas avoir l'une des polices Windows installées sur base de leur machine (Courier New, Comic Sans MS, Arial par exemple). Chaque fois que je tente de construire un d'eux, il renvoie une erreur plutôt que de retomber sur un apparenté, ou vraiment, any autre police.

Quelle est la meilleure façon de construire une police si je voudrais que ce soit Courier, mais je ne suis pas particulièrement épousée à elle?

Était-ce utile?

La solution

Vous pouvez incorporer les polices comme ressources et utiliser le mot-clé unsafe (et doit être compilé avec « dangereux ») pour obtenir les polices ... Voici un exemple de code que j'utilisé pour définir un contrôle utilisateur à la police de type ' OCR '

private PrivateFontCollection pfc = new PrivateFontCollection();
private Font _fntOCRFont = null;
private enum FontEnum{
   OCR = 0
};

qui déclare une collection privée de polices ... la police « OCR » est intégré comme une ressource en utilisant la convention de nommage où « foo » est un espace de noms, d'où le nom de la ressource serait « foo.ocraext.ttf » .. .Look à « InitOCRFont » ici qui charge la police et il ajoute à la collection:

private void InitOCRFont(){
   try{
      System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf");
      if (streamFont != null){
          byte[] fontData = new byte[streamFont.Length];
          streamFont.Read(fontData, 0, (int)streamFont.Length);
          streamFont.Close();
          unsafe{
                fixed(byte *pFontData = fontData){
                   this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length);
                }
          }
      }else{
          throw new Exception("Error! Could not read built-in Font.");
      }
   }catch(Exception eX){
      throw new Exception("InitOCRFont Method - Exception occurred!\nException was: " + eX.Message);
   }
}

Ici, je mets les contrôles dans le contrôle de l'utilisateur pour définir la police à cette police « OCR » par itérer la collection, voir « InitializeCtlFont », la taille de la police est 10 et est un « type face » gras:

private void InitializeCtlFont(){
    this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
    if (this._fntOCRFont != null){
         foreach(Control ctl in this.Controls){
            if (ctl != null && ((ctl is Label) || (ctl is TextBox))){
                        ctl.Font = this._fntOCRFont;
                    }
         }
    }
}

Lorsque le contrôle utilisateur est disposé, il est impératif de libérer les ressources occupées par la police comme indiqué ici dans la méthode Dispose:

try{
   if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}catch{
}
try{
   if (this.pfc != null) this.pfc.Dispose();
}catch{
}

Hope this helps, Meilleures salutations, Tom.

Autres conseils

Eh bien, vous pouvez utiliser FontFamily.GenericMonospace pour obtenir a Monospace font, au lieu de spécifiquement Courier:

Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);

Il y a un peu plus comme police générique familles et .

Vous pouvez également l'utiliser comme un dernier recours après avoir essayé votre police préférée et en cours d'exécution dans une exception.

Ceci est très inhabituel. Le mappeur de police Windows sera toujours fournir une police de remplacement lorsque votre programme demande une police qui ne sont pas disponibles sur la machine cible. Cette police de substitution sera généralement Microsoft Sans Serif sur XP, Segoe UI sur les versions ultérieures. Aucun de ceux-ci devraient jamais causer un problème.

Et puis, si la machine est tellement foiré qu'il ne possède pas les polices de base disponibles, il pourrait ne pas avoir la police TrueType disponible à tous. Oui, ce bomberez votre programme. Franchement, ce n'est pas quelque chose que vous devriez avoir à traiter, à moins que cela est un client très précieux. Il est par ailleurs résolu trivialement par l'équipe de soutien de votre client.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top