Поделиться через


Создание и выделение шрифтов

Диалоговое окно "Общий шрифт " упрощает процесс создания и выбора шрифтов. Инициализировав структуру CHOOSEFONT и вызвав функцию CHOOSEFONT , приложение может поддерживать тот же интерфейс выбора шрифтов, который ранее требовал много строк пользовательского кода. (Дополнительные сведения о стандартном диалоговом окне Шрифт см. в разделе Общая библиотека диалоговых окон.)

Выбор пользователем

Большинство операций создания и выбора шрифтов связаны с пользователем. Например, текстовые приложения позволяют пользователю выбирать уникальные шрифты для заголовков, сносок и основного текста. Когда пользователь выбирает шрифт в диалоговом окне Шрифт и нажимает кнопку ОК , функция CHOOSEFONT инициализирует элементы структуры LOGFONT атрибутами запрошенного шрифта. Чтобы использовать этот шрифт для операций вывода текста, приложение должно сначала создать логический шрифт, а затем выбрать его в контексте устройства. Логический шрифт — это предоставленное приложением описание идеального шрифта. Разработчик может создать логический шрифт, вызвав функции CreateFont или CreateFontIndirect . В этом случае приложение вызовет CreateFontIndirect и направит указатель на структуру LOGFONT , инициализированную методом CHOOSEFONT. Как правило, более эффективно вызывать CreateFontIndirect , так как CreateFont требует несколько параметров, а CreateFontIndirect — только один указатель на LOGFONT.

Прежде чем приложение сможет начать рисование текста с помощью логического шрифта, оно должно найти ближайшее соответствие шрифтов, хранящихся на устройстве, и шрифтов, ресурсы которых были загружены в операционную систему. Шрифты, хранящиеся на устройстве или в операционной системе, называются физическими шрифтами. Процесс поиска физического шрифта, который наиболее точно соответствует указанному логическому шрифту, называется сопоставлением шрифтов. Этот процесс происходит, когда приложение вызывает функцию SelectObject и предоставляет дескриптор, определяющий логический шрифт. Сопоставление шрифтов выполняется с помощью внутреннего алгоритма, который сравнивает атрибуты запрошенного логического шрифта с атрибутами доступных физических шрифтов. Когда алгоритм сопоставления шрифтов завершает поиск и определяет максимально возможное совпадение, функция SelectObject возвращается, и приложение может начать рисование текста с новым шрифтом.

Функция SetMapperFlags указывает, ищет ли алгоритм сопоставления шрифтов только физические шрифты с пропорциями, соответствующими физическому устройству. Пропорции для устройства — это соотношение, формируемое шириной и высотой пикселя на этом устройстве.

Системный шрифт (также известный как шрифт оболочки или шрифт по умолчанию) — это шрифт, используемый для текста в заголовках строк, меню и диалоговых окнах.

Специальные рекомендации по выбору шрифтов

Хотя большинство операций выбора шрифтов связаны с пользователем, в некоторых случаях это не так. Например, разработчик может использовать уникальный шрифт в приложении для рисования текста в окне элемента управления. Чтобы выбрать подходящий шрифт, приложение должно иметь возможность определить, какие шрифты доступны, создать логический шрифт, описывающий один из этих доступных шрифтов, а затем выбрать этот шрифт в соответствующем контексте устройства.

Приложение может перечислить доступные шрифты с помощью функций EnumFonts или EnumFontFamilies . Рекомендуется использовать EnumFontFamilies, так как он перечисляет все стили, связанные с именем семейства. Это может быть полезно для шрифтов с различными или необычными стилями, а также для шрифтов, которые пересекают международные границы.

После перечисления доступных шрифтов приложение должно использовать значения, возвращаемые функцией перечисления шрифтов, для инициализации элементов структуры LOGFONT . Затем он может вызвать функцию CreateFontIndirect , передав ей указатель на инициализированную структуру LOGFONT . Если функция CreateFontIndirect выполнена успешно, приложение может выбрать логический шрифт, вызвав функцию SelectObject . При инициализации элементов структуры LOGFONT обязательно укажите определенную кодировку в элементе lfCharSet . Этот элемент важен в процессе сопоставления шрифтов, и результаты будут несогласованными, если этот элемент не инициализирован правильно. Если вы указываете имя шрифта в элементе lfFaceName структуры LOGFONT , убедитесь, что значение lfCharSet соответствует набору символов шрифта, указанного в lfFaceName. Например, если вы хотите выбрать шрифт, например MS Mincho, для параметра lfCharSet должно быть задано предопределенное значение SHIFTJIS_CHARSET.

Шрифты для многих восточноазиатских языков имеют два названия шрифтов: английское и локализованное. CreateFont, CreateFontIndirect и CreateFontIndirectEx принимают локализованное имя шрифта для системного языкового стандарта, соответствующего языку, но они принимают имя шрифта на английском языке для всех остальных системных языковых стандартов. Лучший способ — попробовать одно имя, а в случае сбоя — другое. Обратите внимание, что EnumFonts, EnumFontFamilies и EnumFontFamiliesEx возвращают имя шрифта на английском языке, если языковой стандарт системы не соответствует языку шрифта. Начиная с Windows 2000, это больше не является проблемой, так как сопоставителя шрифтов для CreateFont, CreateFontIndirect и CreateFontIndirectEx распознает любое имя шрифта независимо от языкового стандарта.