Znów mam problem z rejestrowaniem fontów – tym razem nie chodzi o ich dodawanie z zewnętrznych plików (tamto śmiga), a z ładowaniem z zasobów aplikacji. Już sam nie pamiętam czy wsześniej działało czy nie, nieważne.
Mam plik fonts.lrs
, w którym dodane są trzy fonty. Plik ten dodaję do projektu w sekcji initialization
:
initialization
begin
{$INCLUDE resources\fonts.lrs}
end;
Wszystko gra. Dodaję nagłówki funkcji AddFontMemResourceEx
i RemoveFontMemResourceEx
manualnie, bo ich brakuje:
function AddFontMemResourceEx(pbFont: PVOID; cbFont: DWORD; pdv: PVOID; pcFonts: LPDWORD): HANDLE; external 'gdi32.dll' name 'AddFontMemResourceEx';
function RemoveFontMemResourceEx(fh: HANDLE): LongBool; external 'gdi32.dll' name 'RemoveFontMemResourceEx';
Tu też wszystko gra. Dla testu ładuję jeden font. Inicjalizacja zmiennych:
var
FontHandle: THandle = 0;
FontCount: UInt32 = 0;
Teraz procedura ładująca font z zasobów – ona nie działa prawidłowo. Poniższy sposób znalazłem na forum Lazarusa (jeśli chodzi o wykorzystanie klasy TLazarusResourceStream
i takie jak niżej przekazanie wartości z właściwości strumienia do parametrów funkcji), więc powinien działać:
procedure LoadFont(const AResourceName, AResourceType: String);
var
LStream: TLazarusResourceStream;
begin
LStream := TLazarusResourceStream.Create(AResourceName, PChar(AResourceType));
try
FontHandle := AddFontMemResourceEx(LStream.Memory, LStream.Size, nil, @FontCount);
if (FontHandle = 0) or (FontCount = 0) then
Exit;
finally
LStream.Free();
end;
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;
Funkcja AddFontMemResourceEx
zwraca 0
, więc nie udało się załadować fontu. Procedurę wołam tak:
LoadFont('font_ubuntu_regular', 'TTF');
Po stronie wywołania wszystko gra – nazwa zasobu zgadza się, typ zasobu też, dlatego też strumień tworzy się prawidłowo, ale pomimo tego font nie jest instalowany.
Jeśli ktoś jest w stanie wskazać błąd to byłbym bardzo wdzięczny. Do załączników dodaję testowy, malutki projekt, testowany pod Lazarusem 1.8.0 32-bit, czyli w najnowszej stabilnej wersji.