Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Font dynamisch laden (ohne Installieren)

  Alt 14. Feb 2006, 09:23
Die Schriftartenanzeige von Windows (FONTVIEW.EXE) benutzt die API-Funktionen AddFontResourceW und RemoveFontResourceW immer, d.h. es wird nicht überprüft, ob die Schriftart bereits installiert ist.

Die weiteren Informationen über die Schrift erhält das Programm über die undokumentierte Funktion GetFontResourceInfoW.

Es gibt übrigens *NUR* die Unicode-Version dieser Funktion - daher wird das Ding unter 95/98/ME nicht existieren. Unter 95c gibt's "GetFontResourceInfo", das liefert aber immer false (not implemented). Unter 98/ME kann ich es hier nicht prüfen.

Hier ein kleines Beispiel:
Delphi-Quellcode:
procedure PrintFontToCanvas(Canvas: TCanvas; Font: WideString);
type
  TGetFontResourceInfoW = function(Name: PWideChar; var BufSize: Cardinal;
    Buffer: pointer; InfoType: Cardinal): LongBool; stdcall;
var
  naf, k, y: integer;
  gfri: TGetFontResourceInfoW;
  lf: array of TLogFontW;
  lfsz: Cardinal;
  hfnt: HFONT;
  Name: WideString;
begin
  gfri := GetProcAddress(GetModuleHandle('gdi32.dll'), 'GetFontResourceInfoW');
  if @gfri = nil then
    raise Exception.Create('GetFontResourceInfoW in gdi32.dll nicht gefunden');

  if LowerCase(ExtractFileExt(Font)) = '.pfmthen
    Font := Font + '|' + ChangeFileExt(Font, '.pfb');

  naf := AddFontResourceW(PWideChar(Font));
  try
    if naf > 0 then
    begin
      SetLength(lf, naf);
      lfsz := naf * SizeOf(TLogFontW);
      if not gfri(PWideChar(Font), lfsz, @lf[0], 2) then
        raise Exception.Create('GetFontResourceInfoW fehlgeschlagen');

      y := 0;

      naf := lfsz div SizeOf(TLogFont);
      for k := 0 to naf - 1 do
      begin
        hfnt := CreateFontIndirectW(lf[k]);
        try
          Name := lf[k].lfFaceName;

          Canvas.Font.Handle := hfnt;
          Canvas.TextOut(0, y, Name);
          inc(y, Canvas.TextHeight('X'));
          Canvas.TextOut(0, y, 'The quick brown fox jumps over the lazy dog');
          inc(y, Canvas.TextHeight('X'));
          Canvas.Font.Handle := 0;
        finally
          DeleteObject(hfnt);
        end;
      end;
    end;
  finally
    RemoveFontResourceW(PWideChar(Font));
  end;
end;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat