Установить шрифт в firemonkey

Как я могу использовать встроенный шрифт или установить новые шрифты в моем приложении firemonkey?

Я попробовал это решение, но WM_FONTCHANGE не определено в FMX!

Я хочу использовать пользовательский шрифт в своем приложении, как я могу это сделать?


person sma6871    schedule 13.04.2013    source источник
comment
Использование нового шрифта не сделает ваш текст лучше, если я правильно предполагаю, что этот вопрос связан с другим вашим вопросом.   -  person David Heffernan    schedule 13.04.2013
comment
Нет, это другая проблема!   -  person sma6871    schedule 13.04.2013


Ответы (2)


Я следовал инструкциям здесь, и они помогли. У меня есть несколько дополнительных советов, которые могут помочь,

  • Два включения, которые вам понадобятся для этой работы, — это WinAPI.Windows и WinAPI.Messages.
  • Если вы поместите эти включения в начало предложения «использует», у вас вряд ли возникнут конфликты имен с такими вещами, как TBitmap.

Теперь я добавляю следующий код,

procedure TMainForm.FormCreate(Sender: TObject);
begin
  AddFontResource('c:\fontpath\myfont.ttf');
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  RemoveFontResource('c:\fontpath\myfont.ttf');
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

Когда я запускаю это в форме firemonkey, я заметил следующее.

  1. Код работает
  2. Другие приложения (например, блокнот, офис) могут внезапно увидеть новый шрифт
  3. Текстовые объекты в моем приложении не распознают новый шрифт
  4. Если я динамически назову свой текстовый объект именем шрифта, он все равно не изменится.
  5. Если я динамически назову свой текстовый объект другим очевидным шрифтом, он изменится.
  6. Если я закрою свое приложение, другие приложения перестанут видеть новый шрифт.

Это говорит мне, что мой код работает (см. пункты 1 и 6), но FMX не распознает шрифт в моей основной форме, если вы используете имя, которое появляется в блокноте. Я вчетверо проверил имя шрифта.

Я создал два одинаковых проекта. Один был VCL, а другой FMX. Проект VCL отлично работает как для статического, так и для динамического текста. Код FMX не работает ни для того, ни для другого. Если бы мне пришлось рискнуть предположить, я бы сказал, что FMX создает список шрифтов при запуске и сверяет список доступных шрифтов с этим списком (т.е. как кеш). Рискну предположить, что это делается для того, чтобы абстрагировать FMX от базовой операционной системы...

Если кто делал эту работу под firemonkey, буду признателен за любые советы. Кроме того, если кто-нибудь знает, как достичь той же цели под Mac, я тоже был бы признателен за указатель.

С уважением,

Mr Ed.

person Mr Ed    schedule 24.08.2013
comment
Кто-нибудь нашел решение или обходной путь? - Я могу использовать пользовательские шрифты в iOS и OS X, но не в Windows из-за этой проблемы. - person Hans; 17.09.2014

Вы, безусловно, можете использовать модуль Winapi.Messages в своем приложении FMX, которое явно нацелено на Windows, и константа сообщения определена там.

Если вы не хотите использовать Winapi.Messages, просто определите константу в своем собственном коде:

const
  WM_FONTCHANGE = $001D;
person David Heffernan    schedule 13.04.2013
comment
Я принимаю этот ответ, но когда я тестирую этот метод в новой системе, новый шрифт не устанавливается! - person sma6871; 13.04.2013
comment
Я считаю, что этого недостаточно, потому что кажется, что FMX не видит шрифт. Возможно, FMX использует DirectWrite. - person Warren P; 21.08.2014