Как получить заголовок (не имя) файла текстового шрифта? (TTF и OTF) - PullRequest
0 голосов
/ 03 ноября 2018

ВОПРОС

В C # или VB.NET, в библиотеке классов WinForms или WPF и без необходимости использования сторонних приложений или API, я хотел бы знать, как получить заголовок файла текстового шрифта так же, как это показано при щелчке правой кнопкой мыши по текстовому файлу шрифта и переходу на страницу свойств деталей.

Другими словами, мне нужно получить точное имя, под которым шрифт будет зарегистрирован в реестре Windows, которое не совпадает с именем, которое дает мне свойство System.Drawing.FontFamily.Name и свойство System.Drawing.Font.Name.

RESEARCH

В StackOverflow есть несколько вопросов о том, как получить имя шрифта, например, this и this , но ни один из них для заголовка шрифта.

Ничто из этого не могло мне помочь. Я приведу пример разницы:

У меня есть файл шрифта истинного типа с именем файла "OpenSans-Light.ttf", который на странице свойств сведений отображается как "Open Sans Light", но при использовании решения на основе System.Drawing.FontFamily я получаю имя "Open Санс».

Затем, после того, как я увидел, что, возможно, библиотека классов .NET Framework (WindowsForms) не обеспечивает функциональность для получения заголовка шрифта, я попытался выяснить, какая функция из API Windows может использовать расширение оболочки Windows файл сведений о файле для получения заголовка шрифта ...

... Я не нашел ничего об этом, никакой информации, ничего ни о чем, только функция GetFontData , которая не предоставляет мне нужную мне информацию.

1 Ответ

0 голосов
/ 04 ноября 2018

Я заметил, что столбец «Заголовок» в представлении списка проводника показывает точную строку имени шрифта, которая мне нужна, и, зная это, я понял, что проблему можно легко решить с помощью оболочки свойств оболочки win32 из WindowsAPICodePack библиотека для получения свойства Title файла шрифта.

Мне известно, что я запросил решение без сторонних библиотек, однако я почти уверен, что оно не будет более идеальным решением, чем использование этого, потому что ... ну, похоже, последовательная альтернатива реализует оболочку Win32 собственность обёртывает себя.

Пример кода:

Imports Microsoft.WindowsAPICodePack.Shell

Dim diInfo As New DirectoryInfo("C:\Fonts\")

For Each fiInfo As FileInfo In diInfo.GetFiles("*.ttf", SearchOption.TopDirectoryOnly)
    Dim sFile As ShellFile = ShellFile.FromFilePath(fiInfo.FullName)
    Dim title As String = sFile.Properties.System.Title.Value

    Dim sb As New StringBuilder()
    sb.AppendLine(String.Format("Name.: {0}", fiInfo.Name))
    sb.AppendLine(String.Format("Title: {0}", title))

    Console.WriteLine(sb.ToString())
Next

Пример вывода:

Name.: OpenSans LightItalic.ttf
Title: Open Sans Light Italic

Name.: OpenSans Light_0.ttf
Title: Open Sans Light

Name.: OpenSans-Bold.ttf
Title: Open Sans Bold

Name.: OpenSans-BoldItalic.ttf
Title: Open Sans Bold Italic

Name.: OpenSans-ExtraBold.ttf
Title: Open Sans Extrabold

Name.: OpenSans-ExtraBoldItalic.ttf
Title: Open Sans Extrabold Italic

Name.: OpenSans-Italic.ttf
Title: Open Sans Italic

Name.: OpenSans-Light.ttf
Title: Open Sans Light

Name.: OpenSans-LightItalic.ttf
Title: Open Sans Light Italic

Name.: OpenSans-Regular.ttf
Title: Open Sans

Name.: OpenSans-Semibold.ttf
Title: Open Sans Semibold

Name.: OpenSans-SemiboldItalic.ttf
Title: Open Sans Semibold Italic

Единственное, чего не хватает, это добавить «(TrueType)» или «(OpenType)» в конец строки, если нам действительно нужна та же строка, что и в реестре Windows (в ключе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts).

...