LoadFont / IsFont funktioniert nicht ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

LoadFont / IsFont funktioniert nicht ...

Beitrag 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! /:->
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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.
Zuletzt geändert von diceman am 25.04.2018 10:39, insgesamt 2-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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
Hygge
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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 ...
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Borstensohn
Beiträge: 4
Registriert: 07.11.2004 18:47
Wohnort: Remscheid, NRW

Re: LoadFont / IsFont funktioniert nicht ...

Beitrag 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.
ON ERROR GOTO BED
Antworten