Frage

Ich habe bei zahlreichen Gelegenheiten auf Probleme stoßen, der Nutzer nicht eine der auf ihrem Computer (Courier New, Comic Sans MS, Arial zum Beispiel) installierten Schriftarten Windows-Kern. Jedes Mal, wenn ich versuche, eine davon zu konstruieren sie einen Fehler wirft, anstatt sich auf wieder ein Zusammenhang, oder wirklich, jeder andere Schriftart.

Was ist der beste Weg, um eine Schriftart zu konstruieren, wenn ich es möge Courier sein, aber ich bin nicht besonders fest gebunden, um es?

War es hilfreich?

Lösung

Sie können die Schriften als Ressourcen einbinden und das unsafe Schlüsselwort verwenden (und muss mit ‚unsicher‘ kompiliert werden), um die Schriftarten zu erhalten ... Hier ist ein Beispiel-Code, dass ich verwendet, um einen Benutzer der Steuerung an die Schriftart des Typs zu setzen ' OCR "

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

Das erklärt eine private Sammlung von Schriften ... die Schrift ‚OCR‘ ist als Ressource eingebettet, um die Namenskonvention, wo ‚foo‘ ein Namespace ist, damit der Ressourcenname wäre ‚foo.ocraext.ttf‘ .. .Look bei ‚InitOCRFont‘ hier die Lasten der Schrift und fügt sie der Sammlung:

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

Hier stelle ich die Kontrollen innerhalb der Benutzerverwaltung stellen Sie die Schriftart, dass ‚OCR‘ font durch Iterieren durch die Sammlung finden Sie unter ‚InitializeCtlFont‘, Schriftgröße 10 und ist ein fett ‚Typ-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;
                    }
         }
    }
}

Wenn der Benutzer der Kontrolle angeordnet wird, ist es zwingend notwendig, die Ressourcen, die von der Schrift belegen oben freizugeben, wie hier im Dispose Verfahren gezeigt:

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

Hope, das hilft, Freundliche Grüße, Tom.

Andere Tipps

Nun, könnten Sie FontFamily.GenericMonospace bekommen a Proportionale Schrift, statt speziell Courier:

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

Es gibt ein paar mehr solche generische Schrift Familien als auch .

Sie können dies auch als letztes Mittel verwenden, nachdem Sie Ihre bevorzugte Schriftart und lief in eine Ausnahme zu versuchen.

Das ist sehr ungewöhnlich. Die Windows-Schriftart-Zuordnung wird immer eine Ersatzschrift bereitstellen, wenn Ihr Programm eine Schriftart anfordert, die nicht auf dem Zielcomputer ist. Das Ersatzschrift wird in der Regel Microsoft Sans Serif auf XP, Segoe UI auf neuere Versionen. Keiner von denen, soll jemals ein Problem verursachen.

Dann wieder, wenn die Maschine so durcheinander ist, dass es nicht die Kern Schriftarten zur Verfügung hat, kann es keine Truetype-Schriftart überhaupt zur Verfügung steht. Ja, das wird Ihr Programm bombardieren. Ehrlich gesagt, ist dies nicht etwas, das Sie sollten mit zu tun haben, es sei denn, dies ein wirklich wertvoller Kunde ist. Es wird sonst trivialer gelöst, indem Sie Ihre Kunden-Support-Team.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top