Конвертировать шрифт в строку и обратно
У меня есть приложение, в котором мой пользователь меняет шрифт и цвет шрифта для разных меток и т.д., и они сохраняют его в файле, но мне нужно иметь возможность преобразовать шрифт указанной метки в строку, которая будет записана в файл, и тогда, когда они откроют этот файл, моя программа преобразует эту строку обратно в объект шрифта. Как это может быть сделано? Я нигде не нашел, что показывает, как это можно сделать.
Благодарю вас
Баел
Ответы
Ответ 1
Легко перемещаться из шрифта в строку и обратно с помощью класса System.Drawing.FontConverter. Например:
var cvt = new FontConverter();
string s = cvt.ConvertToString(this.Font);
Font f = cvt.ConvertFromString(s) as Font;
Ответ 2
Вы можете сериализовать класс шрифта в файл.
Подробнее о том, как это сделать, см. эту статью MSDN.
Для сериализации:
private void SerializeFont(Font fn, string FileName)
{
using(Stream TestFileStream = File.Create(FileName))
{
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(TestFileStream, fn);
TestFileStream.Close();
}
}
И для десериализации:
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;
}
Ответ 3
Довольно просто, если вы хотите сделать его доступным для чтения в файле:
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;
}
}
В противном случае сериализация - это путь.
Ответ 4
Во-первых, вы можете использовать следующую статью для перечисления системных шрифтов.
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;
}
Чтобы создать шрифт:
Font font = new Font( STRING, 6F, FontStyle.Bold );
Используйте его для настройки стиля шрифта и т.д.
Label label = new Label();
. . .
label.Font = new Font( label.Font, FontStyle.Bold );
Ответ 5
Используйте этот код для создания шрифта на основе имени и информации о цвете:
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>);