Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблемы и решения: работа со шрифтами в Firemonkey через DirectWrite

Delphi , Графика и Игры , Шрифты

Работа со шрифтами в кросс-платформенных приложениях, созданных с использованием Firemonkey, может быть непростой задачей, особенно если требуется использовать шрифты, хранящиеся в ресурсах программы. В данной статье мы рассмотрим, как можно загрузить шрифт из ресурсов и использовать его временно в памяти, не сохраняя на диск.

Проблема

В VCL загрузка шрифта из ресурсов и его использование из памяти происходит без проблем. Однако, при переходе на Firemonkey, изменение свойства Font.name на Font.family не приводит к смене шрифта. Это указывает на несовместимость кода VCL с Firemonkey.

Контекст

В контексте вопроса пользователь столкнулся с проблемой использования шрифтов, загружаемых из ресурсов, в приложениях на Firemonkey. Код, работавший в VCL, не работал в Firemonkey после изменения свойства шрифта.

Подтвержденный ответ

После изучения различных источников, включая Stack Overflow, было обнаружено, что для использования шрифтов из ресурсов в Firemonkey необходимо использовать другие подходы, отличные от тех, что применяются в VCL. Один из пользователей предложил решение, связанное с использованием WinAPI.D2D1 и загрузкой шрифта с диска через DirectWrite API. Это позволяет определить и загрузить шрифт, который затем становится доступным во всей программе.

Дополнительное решение

Другой пользователь предложил альтернативный способ, заключающийся в использовании функции AddFontResource с временным файлом шрифта, созданным из ресурса. После этого необходимо принудительно обновить список шрифтов, используемых TextLayout, вызвав функции UnregisterCanvasClasses и RegisterCanvasClasses из FMX.Canvas.D2D.pas.

Пример кода

Для демонстрации, приведем пример кода, который создает временный файл шрифта и обновляет список доступных шрифтов:

procedure InstallCustomFont(const ResourceName, TempFileName: string);
var
  ResStream: TResourceStream;
begin
  ResStream := TResourceStream.Create(hInstance, ResourceName, RT_RCDATA);
  try
    FileSaveToStream(ResStream, TempFileName);
    AddFontResource(PChar(TempFileName));
    UnregisterCanvasClasses;
    RegisterCanvasClasses;
  finally
    ResStream.Free;
    DeleteFile(PChar(TempFileName));
  end;
end;

Этот код следует использовать в сочетании с ресурсным файлом, содержащим шрифты, и его необходимо добавить в исходный код проекта.

Заключение

Работа со шрифтами в Firemonkey требует использования специфических методов, отличных от тех, что применяются в VCL. Использование DirectWrite API и обновление списка шрифтов позволяет достичь желаемого результата. Создание временного файла шрифта и его последующее удаление после установки шрифта в систему — ключевой момент в решении проблемы.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой интеграции шрифтов, загружаемых из ресурсов, в кросс-платформенные приложения Firemonkey, используя DirectWrite.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 14:48:09/0.0036900043487549/0