Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#7

Re: Schrift aus Ressource nutzen

  Alt 16. Feb 2010, 08:26
MSDN-Library durchsuchenAddFontMemResourceEx und MSDN-Library durchsuchenRemoveFontMemResourceEx 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat