Seite 1 von 2

LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 09:43
von diceman
Ich kriege hier gerade graue Haare beim Versuch einen Custom Font zu laden ... das doofe ist, daß PureBasic mir kein Feedback gibt, ob ein Font korrekt geladen wurde; es wird einfach immer der Standard-Arial-Font geladen. Auch IsFont(FontID(#Nr)) ist hier keine Hilfe, da dieser selbst bei korrekt geladenem Zeichensatz eine Null zurückgibt:

Beispiel aus der F1-Hilfe:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 270, 160, "Loading font...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	If LoadFont(1, "Cambria", 24)
		SetGadgetFont(#PB_Default, FontID(1))
		TextGadget(0, 10, 10, 250, 40, "Test 24")
	EndIf
	Debug IsFont(FontID(1)) 
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Das Beispiel funktioniert, das heißt "Cambria" wird korrekt geladen, trotzdem gibt der Debugger für IsFont(FontID(1)) eine 0 zurück.
Viele andere, korrekt installierte Fonts, die ich auch in diversen Applikationen auswählen kann, funktionieren nicht, das heißt sie werden immer durch Arial ersetzt.

Danke! /:->

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 10:07
von RSBasic
diceman hat geschrieben:Ich kriege hier gerade graue Haare beim Versuch einen Custom Font zu laden ... das doofe ist, daß PureBasic mir kein Feedback gibt, ob ein Font korrekt geladen wurde; es wird einfach immer der Standard-Arial-Font geladen.
Es liegt daran:
PB-Hilfe hat geschrieben:Auf Windows wird der systemseitige Font-Mapper (die Schriftart-Zuordnung) immer versuchen, eine Schriftart zu finden. Wenn ein nicht existierender Zeichensatz-Name wie z.B. "Tim Now Ronin" verwendet wird, dann versucht der Font-Mapper den am besten passenden zu finden.
diceman hat geschrieben:Das Beispiel funktioniert, das heißt "Cambria" wird korrekt geladen, trotzdem gibt der Debugger für IsFont(FontID(1)) eine 0 zurück.
Das ist falsch. Richtig muss lauten:

Code: Alles auswählen

Debug IsFont(1)

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 10:28
von diceman
Okay, danke, jetzt funktioniert es!
Danke auch nochmal für die Erklärung von IsFont.

Ein bißchen merkwürdig ist das dennoch:
Der BitmapFont, den ich testen wollte, heißt "PressStart2P-Regular".
Nur wurde diese Bezeichnung von PureBasic nicht erkannt/akzeptiert, whatever.
Ich bin dann in die Font-Bibliothekt rein und habe gesehen, daß er dort als "Press Start 2P Standard" geführt wurde.
Auch hier wurde immer mit Arial überschrieben.
Habe die File-Properties nochmal gegengecheckt, da hieß das Teil "PressStart2P-Regular.tff"
Was letztendlich Erfolg brachte, war "Press Start 2P".
:bluescreen: :coderselixir:

Jetzt gehts aber wieder voran! :)


//EDIT:
Werde wohl am Anfang einen Check einbauen, ob jedweder Font, für den ich mich letztendlich entscheide, beim Nutzer korrekt geladen wurde.
Andernfalls wird das Programm einen Hinweis geben, diesen zu installieren.
Das Font-File wird dann natürlich mitgeliefert.

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 10:36
von Kiffi
diceman hat geschrieben:Andernfalls wird das Programm einen Hinweis geben, diesen zu installieren.
Das Font-File wird dann natürlich mitgeliefert.
korrigiere mich, wenn ich falsch liege, aber ich glaube, dass das mit RegisterFontFile() geht.

Grüße ... Peter

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 10:59
von diceman
Hmm, wie ich das sehe, ist IsFont() ein ziemlich nutzloser Befehl, oder? :?
IsFont() wird IMMER ein #True zurückgeben, da bei nicht gefundenem Zeichensatz automatisch der nächst passendere (= Arial) ausgewählt wird ...

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 11:02
von RSBasic
Ja, IsFont() ist anscheinend nur unter Linux und MacOS sinnvoll, da unter Windows eine ähnliche oder Standard-Schriftart geladen wird, wenn die angegebene Schriftart nicht gefunden wurde.
Man könnte aber mit WinAPI die Schriftart eines Gadgets/Fensters manuell ermitteln, ob diese mit der angegebenen Schriftart übereinstimmt. Wenn ja, dann wurde die angegebene Schriftart erfolgreich geladen.

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 11:09
von diceman
Kiffi hat geschrieben:
diceman hat geschrieben:korrigiere mich, wenn ich falsch liege, aber ich glaube, dass das mit RegisterFontFile() geht.
Grüße ... Peter
YES, es geht! :allright:
Man braucht den Font nicht zu installieren, es reicht wenn er im selben Verzeichnis wie das Programm ist!
Man muß nur sicherstellen, die korrekte Bezeichnung zu verwenden, welche von LoadFont() erkannt wird.

Folgendes Beispiel funktioniert bei mir für das FontFile "PressStart2p-Regular.tff", welches NICHT installiert wurde ... es wird nur temporär für das Programm registriert.
Probiert es aus mit einem Font eurer Wahl! 8)

Code: Alles auswählen

If OpenWindow(0, 0, 0, 270, 160, "Loading font...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	If RegisterFontFile("PressStart2P-Regular.ttf")
		If LoadFont(1, "Press Start 2P Regular", 24)
			SetGadgetFont(#PB_Default, FontID(1))
			TextGadget(0, 10, 10, 250, 40, "Test 24")
		EndIf
	Else
		Debug "Ouch!"
	EndIf
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Ich freue mich immer, wenn eine ursprünglich doofe Frage im weiteren Diskussionsverlauf eine konstruktive Transformation erfährt! :lurk:

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 13:52
von ts-soft
diceman hat geschrieben:Andernfalls wird das Programm einen Hinweis geben, diesen zu installieren.
Das wird wohl nicht jeder User wollen, weil je mehr Schriften, um so langsamer das System!
diceman hat geschrieben:Das Font-File wird dann natürlich mitgeliefert.
Unbedingt Copyright beachten, man darf nicht so einfach alle Fonts mitliefern!

RegisterFontFile() ist noch die beste Lösung, solange man die Copyrights beachtet!

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 25.04.2018 14:29
von diceman
Ja, das mit den Copyrights ist mir klar! :)
Ich habe ohnehin vor, nur einen einzigen Font zu verwenden, und da werde ich drauf achten, daß man den frei verwenden darf.
Und da RegisterFontFile() SO super funktioniert, ergibt sich auch die Sache mit dem Hinweis auf den fehlenden Font.

Re: LoadFont / IsFont funktioniert nicht ...

Verfasst: 01.11.2023 21:42
von Borstensohn
Dieser Thread ist zwar uralt, aber da ich eine sehr ähnliche Frage habe, möchte ich keinen neuen eröffnen.

Bei mir werden unter GNU/LInux, genauer: Xubuntu 23.10, Schriften nicht aus einem Ordner im Programmverzeichnis geladen, auch nicht aus dem Programmverzeichnis direkt (die Registrierung der Schrift funktioniert hingegen anscheinend). Es wird eine Ersatzschrift gewählt, vermutlich eine Standardschrift. Wenn eine der angebotenen Schriften jedoch auf dem System installiert ist, klappt das Laden (?!). Das erscheint mir völlig unlogisch, und ich kann den Fehler nicht finden.

Code: Alles auswählen

Procedure SchrArtifika()
	If RegisterFontFile(GetCurrentDirectory() + "fonts/Artifika-Regular.ttf")
		If SchrGr < 9
			SchrGr = 12
		EndIf
		If Artifika = LoadFont(#PB_Any, "Artifika Medium", SchrGr)
			SetGadgetFont(#edtAusgabe, FontID(Artifika))
		Else 
			MessageRequester("Schriftart", "Die Schrift „Artifika Medium“ konnte nicht geladen werden!", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
		EndIf
	Else
		MessageRequester("Schriftart", "Die Schrift „Artifika Medium“ konnte nicht registriert werden!", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
	EndIf
EndProcedure
Bei folgendem Code wird dann noch nicht mal meine Fehlermeldung ausgegeben:

Code: Alles auswählen

Procedure SchrArtifika()
	If RegisterFontFile(GetCurrentDirectory() + "fonts/Artifika-Regular.ttf")
		If SchrGr < 9
			SchrGr = 12
		EndIf
		If LoadFont(0, "Artifika Medium", SchrGr)
			SetGadgetFont(#edtAusgabe, FontID(0))
		Else 
			MessageRequester("Schriftart", "Die Schrift „Artifika Medium“ konnte nicht geladen werden!", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
		EndIf
	Else
		MessageRequester("Schriftart", "Die Schrift „Artifika Medium“ konnte nicht registriert werden!", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
	EndIf
EndProcedure
Und auch das misslingt:

Code: Alles auswählen

Procedure SchrArtifika()
	If RegisterFontFile(GetCurrentDirectory() + "fonts/Artifika-Regular.ttf")
		If SchrGr < 9
			SchrGr = 12
		EndIf
		LoadFont(0, "Artifika Medium", SchrGr)
		SetGadgetFont(#edtAusgabe, FontID(0))
	Else
		MessageRequester("Schriftart", "Die Schrift „Artifika Medium“ konnte nicht registriert werden!", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
	EndIf
EndProcedure
Die Prozedur wird aufgerufen, wenn im Menü des Anwendungsprogrammes die entsprechende Schrift ausgewählt wird, aber auch wenn sie beim Programmstart aus der zugehörigen Einstellungsdatei (.ini) gelesen wird. Alles andere klappt, also Schriftgröße oder Hintergrundfarbe, nur eben das Laden der Schriften aus dem Programmordner nicht.

Vielleicht hat jemand eine Idee, woran es liegen könnte.