Domanda

ho incontrato problemi in numerose occasioni di utenti non avere uno dei caratteri fondamentali di Windows installati sulla propria macchina (Courier New, Comic Sans MS, Arial per esempio). Ogni volta che provo a costruire uno di questi si genera un errore piuttosto che ricadere su un correlato, o realmente, qualsiasi altro tipo di carattere.

Qual è il modo migliore per costruire un carattere se mi piacerebbe che fosse Courier, ma io non sono particolarmente sposata ad esso?

È stato utile?

Soluzione

È possibile incorporare i font come risorse e utilizzare la parola chiave unsafe (e deve essere compilato con 'non sicuro') per ottenere i font ... Ecco un esempio di codice che ho usato per impostare un controllo utente al font di tipo ' OCR '

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

Questo dichiara una collezione privata di font ... il carattere 'OCR' è incorporato come una risorsa utilizzando la convenzione di denominazione in cui 'foo' è uno spazio dei nomi, da cui il nome della risorsa sarebbe 'foo.ocraext.ttf' .. .Look a 'InitOCRFont' qui che carica il tipo di carattere e lo aggiunge alla collezione:

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

In qui, ho impostato i controlli all'interno del controllo utente per impostare il tipo di carattere per che 'OCR' font scorrendo la raccolta, vedere 'InitializeCtlFont', dimensione del carattere è 10 ed è un audace 'tipo-face':

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

Quando il controllo utente ottiene disposto, è indispensabile per liberare le risorse occupate dal carattere, come mostrato qui nel metodo Dispose:

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

Spero che questo aiuti, I migliori saluti, Tom.

Altri suggerimenti

Bene, è possibile utilizzare FontFamily.GenericMonospace per ottenere a di font Monospace, invece di specificamente Corriere:

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

Ci sono un paio di più, quali font generico le famiglie così .

È inoltre possibile utilizzare questo come ultima risorsa dopo aver provato i caratteri preferiti e in esecuzione in un'eccezione.

Questo è molto insolito. Il font mapping di Windows sarà sempre fornire un carattere sostitutivo quando il programma richiede un tipo di carattere che non è disponibile sul computer di destinazione. Quel carattere sostitutivo di solito è Microsoft Sans Serif su XP, Segoe UI nelle versioni successive. Nessuno di coloro che dovrebbe mai causare un problema.

Poi di nuovo, se la macchina è così incasinato che non ha i caratteri di base disponibili, potrebbe avere alcun tipo di carattere TrueType disponibili a tutti. Sì, che si bombardare il vostro programma. Francamente, questo non è qualcosa che si dovrebbe avere a che fare con, a meno che non si tratta di un cliente veramente prezioso. E 'altrimenti banalmente risolto da team di supporto del cliente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top