2010-02-05 54 views
16

Tôi có một ứng dụng mà người dùng của tôi thay đổi phông chữ và màu phông chữ cho các nhãn khác nhau, v.v ... và lưu nó vào một tệp nhưng tôi cần để có thể chuyển đổi phông chữ của nhãn được chỉ định thành chuỗi được ghi vào tập tin, và sau đó khi họ mở tập tin đó chương trình của tôi sẽ chuyển đổi chuỗi đó trở lại thành một đối tượng phông chữ. Điều này có thể giải quyết như thế nào? Tôi đã không tìm thấy bất cứ nơi nào cho thấy làm thế nào nó có thể được thực hiện.chuyển đổi phông chữ thành chuỗi và quay lại một lần nữa

cảm ơn bạn

Bael

+0

như trong bạn muốn lưu tệp .ttf vào tệp của bạn? –

+0

ttf? Ý tôi là tôi chỉ cần chuyển đổi thông tin phông chữ (ví dụ: Arial, 12.0, Regular, Green) thành một tệp. và sau đó khi tôi tải tập tin đó vào một chuỗi chỉ cần chuyển đổi nó thành một đối tượng phông chữ –

Trả lời

28

Thật dễ dàng để đi qua lại từ một phông chữ đến một chuỗi và trở lại với lớp System.Drawing.FontConverter. Ví dụ:

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

cảm ơn bạn nobugz :) –

+0

Theo [MSDN] (http://msdn.microsoft.com/en-us/library/system.drawing.fontconverter.aspx) nó nói _Access lớp FontConverter thông qua lớp TypeDescriptor bằng cách gọi Phương thức GetConverter_. Điều này có tạo nên sự khác biệt nào không? – Ben

+1

Không phải là tôi có thể nghĩ đến, nó chỉ là một chặng đường dài để đọc thuộc tính [TypeConverter] trên lớp Font và nhận được trình chuyển đổi tương tự. Thuộc tính đó sẽ không bao giờ thay đổi, không bao giờ +/- 1% –

0

Trước tiên, bạn có thể sử dụng bài viết sau để liệt kê các phông chữ hệ thống.

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

Để tạo một phông chữ:

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

Sử dụng nó để thiết lập kiểu font vv ....

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

Bạn có thể serialize lớp phông chữ vào một tập tin.

Xem this MSDN article để biết chi tiết về cách thực hiện.

Để serialize:

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

Và để deserialize:

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 đây có lẽ là giải pháp thanh lịch nhất để tuần tự hóa toàn bộ đối tượng. –

+0

Lưu ý rằng bạn không phải sử dụng BinaryFormatter và tuần tự hóa trực tiếp vào một tệp, bạn có thể sử dụng bất kỳ IFormatter và bất kỳ luồng nào. –

0

Sử dụng mã này để tạo một phông chữ dựa trên tên và màu sắc thông tin:

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

Khá đơn giản thực sự nếu bạn muốn làm cho nó có thể đọc được trong tệp:

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

Nếu không, việc tuần tự hóa là cách để thực hiện.

+0

Tôi sẽ không bận tâm đến trình tự sắp xếp của riêng mình vì lớp Font đã được [serializable] rồi. –

Các vấn đề liên quan