Nietypowe czcionki w naszej aplikacji.

markowski

Jakiś czas temu, gdy pytałem się w jaki sposób wyświetlić w moim programie czcionkę, która raczej nie będzie zainstalowana w systemie użytkownika, otrzymałem porady w jaki sposób mu ja zainstalować.
No tak... Ale niezupełnie o to mi chodziło. Chcę użyć czcionki dostarczonej z moim programem i ładować ją jedynie na czas działania programu. Zbyt duża ilość fontów w systemie wcale nie pomaga, a program nie ma być instalatorem czcionek. Oto czego się doszukałem:

W naszym przypadku konieczne będzie użycie funkcji WinApi. Pierwszą więc rzeczą jaką musimy uczynić jest dopisanie do listy uses modułu: ShellApi.

Kopiujemy plik z naszym fontem, do katalogu z projektem aplikacji. Załóżmy, że plik nazywa się: Abc.TTF, a czcionka Alamakota.

Teraz możemy już załadować czcionkę. Zrobimy to przy pomocy funkcji AddFontResource(FileName:PChar). Jak widać, jej jedynym parametrem jest nazwa pliku czcionki. W naszym wypadku będzie to więc:

<b STYLE="color:#808080">AddFontResource('Abc.TTF')</b>

Od razu musimy też ogłosić pojawienie się nowego zasobu:

<b STYLE="color:#808080">SendMessage (HWND_BROADCAST,WM_FONTCHANGE,0,0)</b>

Moment w którym należy to zrobić, to na przykład FormCreate:

procedure TForm1.FormCreate(Sender: TObject); begin {załadowanie pliku czcionki} AddFontResource('TT1154C_.TTF'); {ogłoszenie komunikatu o pojawieniu się nowego zasobu} SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0); end;
Od tego momentu – hulaj dusza, piekła nie ma! Możesz wpisywać sobie nazwę czcionki w obiekcie, w którym masz zamiar go użyć i będzie ona wyświetlana! Jeśli chcielibyśmy użyć jej w RichEdit możemy to zrobić tak:
procedure TForm1.RichEditChange(Sender: TObject); begin RichEdit.Font.Name := 'Alamakota'; end;
Przy kończeniu pracy z aplikacją należałby po sobie posprzątać. W zdarzeniu OnClose formy użyjemy funkcji: RemoveFontResource(FileName:PChar), która usunie czcionkę z systemu. Należy również ponownie ogłosić komunikat : SendMessage (HWND_BROADCAST,WM_FONTCHANGE,0,0)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin RemoveFontResource('Abc.TTF'); SendMessage (HWND_BROADCAST,WM_FONTCHANGE,0,0); end;

0 komentarzy