Ist Schriftart 'xyz' installiert?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hannes
Beiträge: 16
Registriert: 30.05.2006 11:40
Wohnort: Schweiz

Ist Schriftart 'xyz' installiert?

Beitrag 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
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Prüf doch einfach den Rückgabewert bei "LoadFont(..)"
Wenn der <>0 ist ist alles in Ordnung, sonst....
Bild
Ghost
Beiträge: 141
Registriert: 10.04.2006 09:10

Beitrag von Ghost »

kann man nicht einfach im Systemmenü beim Fondordner nachschauen welche Installiert sind?
(nutze v. 3.3)
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

...und gibt es eine möglichkeit, den eigentlichen namen des tatsächlich geladenen fonts zu ermitteln?
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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%
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag 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)
Bild
Hannes
Beiträge: 16
Registriert: 30.05.2006 11:40
Wohnort: Schweiz

Beitrag 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

Code: Alles auswählen

Procedure.b  istSchriftartVerfuegbar(schriftartname.s)
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
Hannes
Beiträge: 16
Registriert: 30.05.2006 11:40
Wohnort: Schweiz

Beitrag 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

PeekS(@*lpelf\elfLogFont\lfFaceName[0])

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()
Antworten