none
Font Serialization RRS feed

  • Вопрос

  • Добрый день. В моем приложении используется шрифт "Segoe UI Symbol"

    Он есть не у всех, и вот решил поставлять вместе с ПО, все от комментировал.

    static void Main() //Запуск приложения
            {
                Gain(); //дёргаем шрифт.
    //Inject();//Установка шрифта
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
    static private void Gain() //метод загрузки шрифта
            {
                FileStream fs = new FileStream("DataFile.dat", FileMode.Open); //этот файл присутсвует, и был ранее записан методом Inject();
                try
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                   Helper.asdqwe = (Font)formatter.Deserialize(fs);
                }
                catch (SerializationException e)
                {
                    MessageBox.Show("Failed to deserialize. Reason: " + e.Message);
                    throw;
                }
                finally
                {
                    fs.Close();
                }
            }
    static public void Inject() //запись шрифта, требуется лишь что бы создать DataFile.dat
            {
                FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
                Font f = new Font("Segoe UI Symbol", 14f);
                // Construct a BinaryFormatter and use it to serialize the data to the stream.
                BinaryFormatter formatter = new BinaryFormatter();
                try
                {
                    formatter.Serialize(fs, f);
                }
                catch (SerializationException e)
                {
                    MessageBox.Show("Failed to serialize. Reason: " + e.Message);
                    throw;
                }
                finally
                {
                    fs.Close();
                }
            }
    public static class Helper //Просто где то храним шрифт
        {
            public static Font asdqwe;
        }
    public partial class butler : Button //и вот используем шрифт
        {
            public butler()
            {
                this.Font = Helper.asdqwe;
                InitializeComponent();
            }
    // тут идут куча кода, тоже с использованием шрифта
    }
    Протестировал на Windows 7 Ultimate, не работает, никаких ексепшнов нет. и вообще не понятно что не так.


    Использование API виндоус не предлагать. Вообще не нравятся такие решения!
    23 октября 2013 г. 14:11

Ответы

  • Файл шрифта кладём рядом с экзешником.

    string fontName = "Segoe UI Symbol"; // тут точное имя
    Font font = new Font(fontName, 15/*размер шрифта*/);
    if (fontName == font.Name)
    {
        // Шрифт существует
        // ...
    }
    else
    {
        // Шрифт не существует
        // Устанавливаем нужный шрифт
        PrivateFontCollection fontCollection = new PrivateFontCollection();
        fontCollection.AddFontFile("sguisym.ttf"); // файл шрифта
        FontFamily family = fontCollection.Families[0];
        font = new Font(family, 15);
    }


    • Помечено в качестве ответа Medet Tleukabiluly 23 октября 2013 г. 17:00
    23 октября 2013 г. 16:30

Все ответы

  • должно быть так. Но вместо кнопки Play "\ue102" появляется квадратик. из-за отсутствия шрифта. Просмотрел куча материалов. большинство похожие, но нет конкретного простого решения, хотя задача то не большая

    23 октября 2013 г. 14:15

  • FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
    Font f = new Font("Segoe UI Symbol", 14f);
    BinaryFormatter formatter = new BinaryFormatter();
    
    formatter.Serialize(fs, f);
    

    Таким образом в файл запишутся лишь свойства объекта шрифта, но не сам шрифт.

    Нужно поставлять со своим приложением файл шрифта, что-то вроде "Segoe.ttf".


    • Изменено Petalvik 23 октября 2013 г. 14:47
    • Предложено в качестве ответа YatajgaModerator 23 октября 2013 г. 15:29
    23 октября 2013 г. 14:45
  • Ok, файл шрифта есть, "sguisym.ttf". Как дальше двигаться

    1. Без инстарялора, приложение не большое ведь.

    2. Без API Windows.

    23 октября 2013 г. 16:11
  • Файл шрифта кладём рядом с экзешником.

    string fontName = "Segoe UI Symbol"; // тут точное имя
    Font font = new Font(fontName, 15/*размер шрифта*/);
    if (fontName == font.Name)
    {
        // Шрифт существует
        // ...
    }
    else
    {
        // Шрифт не существует
        // Устанавливаем нужный шрифт
        PrivateFontCollection fontCollection = new PrivateFontCollection();
        fontCollection.AddFontFile("sguisym.ttf"); // файл шрифта
        FontFamily family = fontCollection.Families[0];
        font = new Font(family, 15);
    }


    • Помечено в качестве ответа Medet Tleukabiluly 23 октября 2013 г. 17:00
    23 октября 2013 г. 16:30