AddFontMemResourceEx und
RemoveFontMemResourceEx und diese liegen schon mindestens seit Delphi 7 in der Windows-
Unit rum.
Die so "installierten", bzw. geladenen Fonts sind nur innerhalb der entsprechenden Anwendung gültig.
Infos zu den nötigen Font-Resourcen:
http://msdn.microsoft.com/en-us/library/aa381043.aspx
Folgende Codes sind ungetested und nur Anhand der Quellen zusammengebastelt:
Delphi-Quellcode:
Function LoadResFont(Const ResName: String; ResType: PChar = RT_FONT; InstalledFonts: PLongWord = nil): THandle; Overload;
Var Res: TResourceStream;
Count: LongWord;
Begin
Res := TResourceStream.Create(HInstance, PChar(ResName), ResType);
Try
Result := AddFontMemResourceEx(Res.Memory, Res.Size, nil, @Count);
If Assigned(InstalledFonts) Then InstalledFonts^ := Count;
Finally
Res.Free;
End;
End;
Function LoadResFont(ResID: Integer; InstalledFonts: PLongWord = nil): THandle; Overload;
Var Res: TResourceStream;
Count: LongWord;
Begin
Res := TResourceStream.CreateFromID(HInstance, ResID, RT_FONT);
Try
Result := AddFontMemResourceEx(Res.Memory, Res.Size, nil, @Count);
If Assigned(InstalledFonts) Then InstalledFonts^ := Count;
Finally
Res.Free;
End;
End;
Function LoadResFont(FontStream: TStream; InstalledFonts: PLongWord = nil): THandle; Overload;
Var Size: Integer;
Mem: Pointer;
Count: LongWord;
Begin
Size := FontStream.Size - FontStream.Position;
Mem := GetMemory(Size);
Try
FontStream.ReadBuffer(Mem^, Size);
Result := AddFontMemResourceEx(Mem, Size, nil, @Count);
If Assigned(InstalledFonts) Then InstalledFonts^ := Count;
Finally
FreeMemory(Mem);
End;
End;
Procedure UnloadResFont(Font: THandle);
Begin
RemoveFontMemResourceEx(Font);
End;
Da die Daten nicht direkt mit der Resource verknüpft sind, wären theoretisch sogar andere Quellen möglich,
darum ist als Beispiel FontStream:TStream mit vorhanden.