2010-02-05 17 views
16

Ho un'applicazione in cui il mio utente cambia il carattere e il colore del carattere per diverse etichette ecc. E lo salvano in un file, ma devo essere in grado di convertire il carattere dell'etichetta specificata in una stringa da scrivere sul file, e poi quando aprono quel file il mio programma convertirà quella stringa in un oggetto font. Come si può fare? Non ho trovato da nessuna parte che mostra come può essere fatto.convertire il carattere in stringa e tornare indietro

ringraziamento

Bael

+0

come in si desidera memorizzare il file .ttf nel file? –

+0

ttf? Quello che voglio dire è che ho solo bisogno di convertire le informazioni sui font (esempio: Arial, 12.0, Regular, Green) in un file. e poi quando carico quel file in una stringa lo converto in un oggetto font –

risposta

28

È facile andare avanti e indietro da un carattere a una stringa e viceversa con la classe System.Drawing.FontConverter. Ad esempio:

 var cvt = new FontConverter(); 
     string s = cvt.ConvertToString(this.Font); 
     Font f = cvt.ConvertFromString(s) as Font; 
+0

grazie nobugz :) –

+0

Secondo [MSDN] (http://msdn.microsoft.com/en-us/library/system.drawing.fontconverter.aspx) dice _Accedi alla classe FontConverter tramite la classe TypeDescriptor chiamando il Metodo GetConverter_. Questo fa qualche differenza? – Ben

+1

Non che io possa pensare, è solo il modo più lungo per leggere l'attributo [TypeConverter] nella classe Font e ottenere lo stesso identico convertitore. Questo attributo non cambierà mai, mai +/- 1% –

0

In primo luogo, è possibile utilizzare seguente articolo per enumerare i font di sistema.

public void FillFontComboBox(ComboBox comboBoxFonts) 
{ 
    // Enumerate the current set of system fonts, 
    // and fill the combo box with the names of the fonts. 
    foreach (FontFamily fontFamily in Fonts.SystemFontFamilies) 
    { 
     // FontFamily.Source contains the font family name. 
     comboBoxFonts.Items.Add(fontFamily.Source); 
    } 

    comboBoxFonts.SelectedIndex = 0; 
} 

Per creare un font:

Font font = new Font(STRING, 6F, FontStyle.Bold); 

utilizzarla per l'installazione del font stile ecc ....

Label label = new Label(); 
. . . 
label.Font = new Font(label.Font, FontStyle.Bold); 
4

È possibile serialize la classe di carattere in un file.

Vedere this MSDN article per dettagli su come procedere.

per serializzare:

private void SerializeFont(Font fn, string FileName) 
{ 
    using(Stream TestFileStream = File.Create(FileName)) 
    { 
    BinaryFormatter serializer = new BinaryFormatter(); 
    serializer.Serialize(TestFileStream, fn); 
    TestFileStream.Close(); 
    } 
} 

E per deserializzare:

private Font DeSerializeFont(string FileName) 
{ 
    if (File.Exists(FileName)) 
    { 
     using(Stream TestFileStream = File.OpenRead(FileName)) 
     { 
      BinaryFormatter deserializer = new BinaryFormatter(); 
      Font fn = (Font)deserializer.Deserialize(TestFileStream); 
      TestFileStream.Close(); 
     } 
     return fn; 
    } 
    return null; 
} 
+1

+1 questa è probabilmente la soluzione più elegante per serializzare l'intero oggetto. –

+0

Nota che non devi usare BinaryFormatter e serializzare direttamente su un file, puoi usare qualsiasi IFormatter e qualsiasi Stream. –

0

Usa questo codice per creare un tipo di carattere in base al nome e il colore informazioni:

Font myFont = new System.Drawing.Font(<yourfontname>, 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
Color myColor = System.Drawing.Color.FromArgb(<yourcolor>); 
1

Molto semplice, in realtà se si desidera renderlo leggibile nel file:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Label someLabel = new Label(); 
     someLabel.Font = new Font("Arial", 12, FontStyle.Bold | FontStyle.Strikeout | FontStyle.Italic); 

     var fontString = FontToString(someLabel.Font); 
     Console.WriteLine(fontString); 
     File.WriteAllText(@"D:\test.txt", fontString); 

     var loadedFontString = File.ReadAllText(@"D:\test.txt"); 

     var font = StringToFont(loadedFontString); 
     Console.WriteLine(font.ToString()); 

     Console.ReadKey(); 
    } 

    public static string FontToString(Font font) 
    { 
     return font.FontFamily.Name + ":" + font.Size + ":" + (int)font.Style; 
    } 

    public static Font StringToFont(string font) 
    { 
     string[] parts = font.Split(':'); 
     if (parts.Length != 3) 
      throw new ArgumentException("Not a valid font string", "font"); 

     Font loadedFont = new Font(parts[0], float.Parse(parts[1]), (FontStyle)int.Parse(parts[2])); 
     return loadedFont; 
    } 
} 

Altrimenti la serializzazione è la strada da percorrere.

+0

Non mi preoccuperei di stampare il mio serializzatore poiché la classe Font è già [serializzabile]. –

Problemi correlati