Seite 1 von 2
Ist Schriftart 'xyz' installiert?
Verfasst: 05.06.2006 16:38
von Hannes
Wie kann ich feststellen ob eine bestimmte Schriftart 'xyz' im System vorhanden ist? Ich möchte falls die eine Schriftart nicht installiert ist eine Default-Schriftart ("Lucida Sans Unicode") laden. Also ähnlich vorgehen wie ein Browser, der den CSS-Befehl 'font-family' auswertet.
Die PB4-Hilfe kennt nur die folgenden Funktionen betreffend Fonts:
- - FontID
- FreeFont
- IsFont
- LoadFont
Danke für die Antwort im voraus.
--Hannes
Verfasst: 05.06.2006 17:01
von Jilocasin
Prüf doch einfach den Rückgabewert bei "LoadFont(..)"
Wenn der <>0 ist ist alles in Ordnung, sonst....
Verfasst: 05.06.2006 18:23
von Ghost
kann man nicht einfach im Systemmenü beim Fondordner nachschauen welche Installiert sind?
Verfasst: 05.06.2006 18:28
von #NULL
dann müsstest du aber einige ordner durchsuchen. für jedes OS, und z.b. bei mac gibts da auch noch mehrere font-ordner. einfacher als es Jilocasin beschrieben hat, kann es eigentlich nich gehn. (es sei denn es gibt wirklich einen FontIsInstalled() befehl)
Verfasst: 05.06.2006 18:38
von remi_meier
Das Problem bei LoadFont() ist
Hilfe hat geschrieben:Hinweis: Unter Windows versucht der systemseitige Font-Mapper immer, einen passenden Zeichensatz für Sie zu finden. Wenn Sie z.B. versuchen einen Zeichensatz mit Namen "Tim Now Ronin" zu öffnen und dieser Zeichensatz-Name existiert nicht, dann versucht der Font-Mapper denn am besten passenden (anhand von Name, Zeichensatzhöhe, Stil, etc.) Zeichensatz zu finden und zu öffnen. Gehen Sie also nicht davon aus, dass kein Zeichensatz geladen wird, wenn Sie einen falsche(n) Namen oder Größe angeben.
Verfasst: 05.06.2006 18:58
von #NULL
...und gibt es eine möglichkeit, den eigentlichen namen des tatsächlich geladenen fonts zu ermitteln?
Verfasst: 05.06.2006 19:13
von Kaeru Gaman
das beschriebene verhalten des fontmappers hab ich aber noch nie beobachten können.
bin jetzt allerdings auch nicht sicher, ob nun arial geladen wird oder keiner...
ob LoadFont() nen fehler zurückliefert oder nich...
wenn du ja nun ganz genau weißt, wie der zeichensatz heißt, den du verwenden willst, und du nur für windows programmierst, kannst du checken, ob der zeichensatz im ordner ist.
der unterordner heißt immer FONTS und der pfad steht in der env-var %SYSTEM%
Verfasst: 05.06.2006 19:23
von Jilocasin
odda so....
Code: Alles auswählen
Procedure EnumFontFamProc(*lpelf.ENUMLOGFONT, *lpntm.NEWTEXTMETRIC, FontType, lParam)
Debug PeekS(@*lpelf\elfLogFont\lfFaceName[0])
ProcedureReturn 1
EndProcedure
Procedure SysInfo_Fonts()
hWnd = GetDesktopWindow_()
hDC = GetDC_(hWnd)
EnumFontFamilies_(hDC, 0, @EnumFontFamProc(), 0)
ReleaseDC_ (hWnd, hDC)
EndProcedure
SysInfo_Fonts()
(muss natürlich umgeändert werden)
Verfasst: 05.06.2006 21:27
von Hannes
Danke für die bisherigen Antworten. Es läuft also darauf hinaus dass im Fall von MSWindows (Linux kommt später) die Aufgabe mit WIN32-API-Aufrufen durchzuführen ist.
Ich möchte eine Funktion mit dem Header
Rückgabewert ist 1, falls sie verfügbar ist, sonst 0.
Die Schritte, wie ich das mit den von Jilocasin angegebenen Prozeduren erreichen kann, sehe ich nicht.
--Hannes
Verfasst: 06.06.2006 07:59
von Hannes
Im englischen Forum habe ich einen Post (März 2002) gefunden, der sich damit beschäftigt, wie man eine Liste der installierten Fonts erhält.
http://www.purebasic.fr/english/viewtopic.php?t=4118
Es gibt ein Beispielprogramm, das dann allerdings nicht lief. Mit einer Korrektur die angegeben ist soll es laufen,
Code: Alles auswählen
Procedure EnumFontFamProc(lParam, FontType, *lpntm.NEWTEXTMETRIC, *lpelf.ENUMLOGFONT2)
Mir ist nicht klar, was die Parameter bedeuten und wie ich sie anpassen muss.
Vielleicht kann jemand den Code von dort herauskopieren und eine für PB4 angepasste Version hier hineinstellen?
--Hannes
Der Code, den Jilocasin oben gepostet hat findet sich auch dort:
http://www.purebasic.fr/english/viewtopic.php?t=2732
Der Code funktioniert, aber es ist mir nicht klar, was er macht.
Das Resultat steckt in
Code: Alles auswählen
OpenConsole()
Procedure EnumFontFamProc(*lpelf.ENUMLOGFONT, *lpntm.NEWTEXTMETRIC, FontType, lParam)
Debug PeekS(@*lpelf\elfLogFont\lfFaceName[0])
ProcedureReturn 1
EndProcedure
Procedure SysInfo_Fonts()
hWnd = GetDesktopWindow_()
hDC = GetDC_(hWnd)
EnumFontFamilies_(hDC, 0, @EnumFontFamProc(), 0)
ReleaseDC_ (hWnd, hDC)
EndProcedure
SysInfo_Fonts()
Print("Press a ENTER to quit")
Input()