![]() |
Font dynamisch laden (ohne Installieren)
Hallo,
wollte mich mal erkundigen, ob es möglich ist eine Font zu benutzen, ohne sie zu installieren bzw. registrieren. "Einfach" nur kurzeitig damit z.B. einen Satz schreiben. Die Datei liegt vor und ist nicht in einer Resource oder ähnlichem. Wenn ich z.B. auf eine TT Schriftart klicke dann kommt dieser Windows Dialog und da wird sie ja auch angezeigt, ohne installiert zu sein. vielen Dank Florian PS: 2. Frage gleich hinterher, wenn ich den Dateinamen XYZ__.TTF habe, die Font heißt 'ABC'. Wie komme ich an den eigentlichen Font Namen, wenn ich lediglich den Dateinamen besitze? |
Re: Font dynamisch laden (ohne Installieren)
Hallo,
unter ![]() Gruß Stefan P.S.: Sorry, für die sehr kurze Antwort, aber ich bin gerade im Arbeitsstress ;-) |
Re: Font dynamisch laden (ohne Installieren)
Hatte ich mir schon angesehen, aber das ist ja das Problem. Die Fonts werden installiert und danach wieder deinstalliert.
Was wäre z.B. wenn die Font, welche installiert wird, schon(!) vorhanden ist? Dann wird sie ja beim beenden entfernt! Außerdem habe ich dann immernoch das Problem, dass ich von dem Dateinamen nicht gleich auf den FontNamen zurückschließen kann. Ist das mit dem TTF Windows Dialog so eine Interne Sache, oder ließe sich das "nachbauen". Trotzdem Danke Florian |
Re: Font dynamisch laden (ohne Installieren)
Zitat:
PS: Sichere den Font vorher! :lol: |
Re: Font dynamisch laden (ohne Installieren)
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)) = '.pfm' then 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz