2010-02-05 20 views
16

tengo una aplicación donde mi usuario cambia el color de fuente y fuente para diferentes etiquetas, etc. y la guardan en un archivo, pero necesito poder convertir la fuente de la etiqueta especificada en una cadena para escribir en el archivo, y luego, cuando abran ese archivo, mi programa convertirá esa cadena nuevamente en un objeto de fuente. ¿Cómo puede hacerse esto? No he encontrado ningún lugar que muestre cómo se puede hacer.convertir fuente a cadena y viceversa

agradecimiento

Bael

+0

como desea almacenar el archivo .ttf en su archivo? –

+0

ttf? Lo que quiero decir es que solo necesito convertir la información de la fuente (ejemplo: Arial, 12.0, Regular, Verde) a un archivo. y luego cuando cargue ese archivo en una cadena simplemente conviértalo en un objeto de fuente –

Respuesta

28

Es fácil ir y venir de una fuente a una cadena y viceversa con la clase System.Drawing.FontConverter. Por ejemplo:

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

gracias nobugz :) –

+0

Según [MSDN] (http://msdn.microsoft.com/en-us/library/system.drawing.fontconverter.aspx) dice _Acceda a la clase FontConverter a través de la clase TypeDescriptor llamando al Método GetConverter_. ¿Esto hace alguna diferencia? – Ben

+1

No es que yo pueda pensar, es solo el camino más largo para leer el atributo [TypeConverter] en la clase Font y obtener exactamente el mismo convertidor. Ese atributo nunca va a cambiar, nunca +/- 1% –

0

En primer lugar, puede utilizar artículo siguiente para enumerar las fuentes del 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; 
} 

Para crear un tipo de letra:

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

lo uso para la configuración de la fuente de estilo, etc ....

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

Puede serialize la clase de fuente en un archivo.

Consulte this MSDN article para obtener detalles sobre cómo hacerlo.

para serializar:

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

Y deserializar:

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. Esta es probablemente la solución más elegante para serializar todo el objeto. –

+0

Tenga en cuenta que no tiene que usar BinaryFormatter y serializar directamente en un archivo, puede usar cualquier IFormatter y cualquier Stream. –

0

Usar este código para crear un tipo de letra en función del nombre y color información:

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

bastante simple en realidad si desea que sea legible en el archivo:

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

De lo contrario, la serialización es el camino a seguir.

+0

No me molestaría en rodar mi propio serializador ya que la clase de fuente ya es [serializable]. –

Cuestiones relacionadas