Закрытые шрифты в WinRT

101

Ваши программы Windows Store могут использовать любые контурные шрифты из каталога /Windows/Fonts, но как упоминалось ранее, для выполнения перебора доступных имен семейств шрифтов необходимо использовать Direct Write.

Иногда в программах требуется использовать шрифты, которых может не быть в установленной копии Windows. Традиционное решение — распространение шрифтов вместе с приложением и их установка, но в некоторых ситуациях шрифты должны оставаться закрытыми для других приложений - например, если по условиям лицензии они могут использоваться только этим конкретным приложением.

В таких случаях файлы шрифтов могут рассматриваться как ресурсы приложения; фактически они встраиваются в исполняемый файл приложения. Проект PrivateFonts показывает, как это делается. Я создал в проекте папку с именем Fonts и добавил в нее восемь файлов TrueType:

Встраиваемые в приложение файлы шрифтов

Для каждого файла шрифта в качестве действия сборки (Build Action) задано значение по умолчанию Content. Создавая такую программу в Visual Studio для других пользователей, вы не сможете просто добавить произвольные файлы шрифтов в проект. Так как файлы шрифтов будут распространяться как часть приложения, вы должны иметь разрешение на их распространение. Для многих шрифтов (включая шрифты, входящие в поставку Windows и приложений Windows) распространение файлов возможно лишь при наличии лицензии для такого использования, выданной производителем шрифта.

Однако у конкретных файлов шрифтов, добавленных в мой проект PrivateFonts, такие ограничения отсутствуют. Вероятно, программисты XNA узнают в них файлы шрифтов, лицензированные компанией Microsoft у Ascender Corporation для бесплатного распространения с приложениями.

Элемент TextBlock в файле XAML обращается к этим шрифтам с несколько измененным форматом атрибута FontFamily. Обычно FontFamily задается имя семейства шрифтов — например, «Times New Roman» или «Segoe UI». Для использования закрытого шрифта необходимо задать URI-адрес, состоящий из местонахождения файла шрифта, решетки (#) и имени семейства шрифтов, как в следующем файле:

<Page ... FontSize="36">

    <Grid Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <StackPanel>
            <TextBlock Text="Kootenay"
                       FontFamily="ms-appx:///Fonts/Kooten.ttf#Kootenay" />

            <TextBlock Text="Lindsey"
                       FontFamily="ms-appx:///Fonts/Linds.ttf#Lindsey" />

            <TextBlock Text="Miramonte"
                       FontFamily="ms-appx:///Fonts/Miramo.ttf#Miramonte" />

            <TextBlock Text="Miramonte Bold"
                       FontFamily="ms-appx:///Fonts/Miramob.ttf#Miramonte" />

            <TextBlock Text="Pescadero"
                       FontFamily="ms-appx:///Fonts/Pesca.ttf#Pescadero" />

            <TextBlock Text="Pescadero Bold"
                       FontFamily="ms-appx:///Fonts/Pescab.ttf#Pescadero" />

            <TextBlock Text="Pescadero Bold*"
                       FontFamily="ms-appx:///Fonts/Pesca.ttf#Pescadero"
                       FontWeight="Bold" />

            <TextBlock Text="Pescadero Italic*"
                       FontFamily="ms-appx:///Fonts/Pesca.ttf#Pescadero"
                       FontStyle="Italic" />

            <TextBlock Text="Pericles"
                       FontFamily="ms-appx:///Fonts/Peric.ttf#Pericles" />

            <TextBlock Text="Pericles Light"
                       FontFamily="ms-appx:///Fonts/Pericl.ttf#Pericles" />
        </StackPanel>

        ...
        
        <TextBlock Text="* искусственый"
                   Grid.ColumnSpan="4"
                   VerticalAlignment="Bottom"
                   HorizontalAlignment="Center" />
    </Grid>
</Page>

Строки FontFamily содержат префикс ms-appx для ссылок на встроенный контент файла приложения, за которым следует папка Fonts и имя файла в папке. URI-адрес файла Kooten.ttf выглядит так:

ms-appx:///Fonts/Kooten.ttf

Префикс ms-appx:/// можно удалить — программа будет работать так же. За URI-адресом следует знак # и имя семейства в файле шрифта:

FontFamily="ms-appx:///Fonts/Kooten.ttf#Kootenay"

В общем случае имя семейства шрифтов не совпадает с именем файла (хотя может и совпадать). Чтобы узнать имя семейства шрифтов для произвольного файла TrueType, не хранящегося в каталоге /Windows/Fonts, щелкните правой кнопкой на файле шрифта в Проводнике Windows и выберите команду Свойства или Предварительный просмотр.

Файл Miramo.ttf содержит нормальную версию шрифта Miramonte; полужирная версия хранится в файле Miramob.ttf. Обратите внимание: в обоих случаях имя семейства шрифтов задается в разметке в виде «Miramonte». Если бы эти два файла были установлены в системе Windows, на любой из них можно было бы ссылаться, задавая атрибуту FontFamily значение «Miramonte», а для получения полужирной версии следовало бы задать атрибуту FontWeight значение Bold. В синтаксисе с указанием файла шрифта имя семейства шрифтов остается тем же, но задавать FontWeight не нужно.

Аналогичным образом файл Peric.ttf содержит обычный шрифт Pericles, а файл Pericl.ttf содержит Light-версию; файл Pesca.ttf — обычный шрифт Pescadero, а файл Pescab.ttf — Bold-версию и т.д.

Обратите внимание: два последних элемента TextBlock ссылаются на файл с нормальной версией шрифта Pescadero, но атрибутам FontWeight и FontStyle заданы значения Bold и Italic соответственно. Так как атрибуты применяются к обычному шрифту, эти варианты начертания синтезируются (на что указывает звездочка и сноска).

Программа PrivateFonts выводит результат в четыре столбца. Для приведенной разметки XAML будет сгенерирован следующий столбец:

Использование различных гарнитур шрифта

Программа PrivateFonts выводит четыре столбца очень похожего текста. Мы пока видели только один столбец, так что работа с программой еще не закончена.

Пройди тесты
Лучший чат для C# программистов