none
Как по данным FontDialog узнать имя файла шрифтов. RRS feed

Ответы

  • Из диалога Вы вряд ли можете получить имя файла, исключительно зарегистрированное имя шрифта в системе. Информация, связывающая имя шрифта и имя соответствующего файла хранится в реестре. Здесь пример кода на C++, извлекающий имя файла.
    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:15
    21 декабря 2013 г. 22:37
  • Переводить "дословно" необязательно. Важна идея: открываете ключ реестра (путь указан вначале примера), перебираете именованные параметры этого ключа и ищете параметр, имя которого совпадает с названием шрифта. Значением этого параметра и будет имя файла в папке Windows\Fonts. С реестром позволяет работать класс Registry.
    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:15
    22 декабря 2013 г. 7:58
  • Заглянул в реестр. Оказалось, все не так просто :) Имя параметра кроме имени шрифта содержит еще кое-что:

    Видимо, строку для поиска параметра нужно сформировать по такой схеме.



    • Изменено kosuke904 22 декабря 2013 г. 9:23
    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:15
    22 декабря 2013 г. 9:17
  • Вот еще чуть крупнее:

    Как видите, не все шрифты хранят начертание Bold и Italic в отдельных файлах. Поэтому единой схемы формирования строки не придумаешь. Может быть придется искать разные строки, пока не будет достигнут успех. Например, в диалоге выбран шрифт Arial Black с начертанием Bold. Формируем строку "Arial Black Bold (TrueType)", ищем - неудача. Тогда отбрасываем Bold и ищем снова - успех.

    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:14
    22 декабря 2013 г. 9:35

Все ответы

  • private string ttf_location= string.Empty;
    private string ttf_Name= string.Empty;
    private string ttf_NameWithExtension= string.Empty;
    
    private void button1_Click(object sender, System.EventArgs e)
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
    
        openFileDialog1.InitialDirectory = "c:\\" ;
        openFileDialog1.Filter = "ttf files (*.ttf)|*.ttf|All files (*.*)|*.*" ;
        openFileDialog1.FilterIndex = 2 ;
        openFileDialog1.RestoreDirectory = true ;
    
        if(openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            ttf_location = System.IO.Path.GetFileName(openFileDialog1.FileName);
            ttf_Name= openFileDialog1.FileName;
            ttf_NameWithExtension = openFileDialog1.SafeFileName;
        }
    }



    21 декабря 2013 г. 20:27
  • Ну во первых я спрашивал про fontdialog, а во вторых папку font нельзя открыть из openfiledialog
    21 декабря 2013 г. 21:39
  • Из диалога Вы вряд ли можете получить имя файла, исключительно зарегистрированное имя шрифта в системе. Информация, связывающая имя шрифта и имя соответствующего файла хранится в реестре. Здесь пример кода на C++, извлекающий имя файла.
    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:15
    21 декабря 2013 г. 22:37
  • Только вот перевести бы этот код на c#, а то я очень плохо знаю c++
    22 декабря 2013 г. 7:41
  • Переводить "дословно" необязательно. Важна идея: открываете ключ реестра (путь указан вначале примера), перебираете именованные параметры этого ключа и ищете параметр, имя которого совпадает с названием шрифта. Значением этого параметра и будет имя файла в папке Windows\Fonts. С реестром позволяет работать класс Registry.
    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:15
    22 декабря 2013 г. 7:58
  •             RegistryKey rfont=Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts");
                string fin = "";
                if (fontDialog1.ShowDialog() == DialogResult.OK)
                {
                    fin=rfont.GetValue(fontDialog1.Font.Name)+"";
                }
    Только вот почему то программа не хочет читать значение. В строке fin после выполнения остаётся пустая строчка.
    22 декабря 2013 г. 8:29
  • Заглянул в реестр. Оказалось, все не так просто :) Имя параметра кроме имени шрифта содержит еще кое-что:

    Видимо, строку для поиска параметра нужно сформировать по такой схеме.



    • Изменено kosuke904 22 декабря 2013 г. 9:23
    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:15
    22 декабря 2013 г. 9:17
  • Вот еще чуть крупнее:

    Как видите, не все шрифты хранят начертание Bold и Italic в отдельных файлах. Поэтому единой схемы формирования строки не придумаешь. Может быть придется искать разные строки, пока не будет достигнут успех. Например, в диалоге выбран шрифт Arial Black с начертанием Bold. Формируем строку "Arial Black Bold (TrueType)", ищем - неудача. Тогда отбрасываем Bold и ищем снова - успех.

    • Помечено в качестве ответа Grey5 22 декабря 2013 г. 11:14
    22 декабря 2013 г. 9:35
  • Большое спасибо
    22 декабря 2013 г. 11:14