[Source] Fonts richtig laden und überprüfen! [Windows OS]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Mijikai
Beiträge: 698
Registriert: 25.09.2016 01:42

[Source] Fonts richtig laden und überprüfen! [Windows OS]

Beitrag von Mijikai »

LoadFont() kann unter Umständen unbrauchbar sein, da die Funktion einem nicht mitteilt
ob eine bestimmter Font wirklich unter Windows OS geladen werden konnte bzw. verfügbar ist.

Dies ist in der Hilfe auch so beschrieben.

Was also tun um herauszufinden ob der Font der Gewüschte ist oder nicht?

Edit: Sourcecode geändert!

Die Lösung:

Code: Alles auswählen

EnableExplicit

;Function AllocFont() - How to correctly load and verify a Font on Windows OS!
;Author: Mijikai

Procedure.i FontCallback(*LogFont.LOGFONT,*TextMetric.TEXTMETRIC,FontType.i,*Name)
  If PeekS(@*LogFont\lfFaceName[0]) = PeekS(*Name)
    PokeS(*name,#Null$)
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure.i AllocFont(Name.s,Height.i,Style.i = #Null)
  Protected hdc.i
  Protected lf.LOGFONT
  Protected try.s
  If Name
    hdc = CreateCompatibleDC_(#Null) 
    If hdc
      try = Name
      lf\lfCharSet = #DEFAULT_CHARSET
      EnumFontFamiliesEx_(hdc,@lf,@FontCallback(),@try,#Null)
      DeleteDC_(hdc)
      If try
        ProcedureReturn #Null
      EndIf
      ProcedureReturn LoadFont(#PB_Any,Name,Height,Style)
    EndIf
  EndIf
  ProcedureReturn #Null
EndProcedure

Procedure.i Main()
  Protected font.i
  font = AllocFont("Arial",32)
  If font
    Debug "Font loaded!"
    FreeFont(font)
  Else
    Debug "Font could not be loaded!"
  EndIf
  ProcedureReturn #Null
EndProcedure

Main()

End
Viel Spass :)
Zuletzt geändert von Mijikai am 15.05.2021 15:18, insgesamt 3-mal geändert.
Benutzeravatar
diceman
Beiträge: 335
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: [Source] Fonts richtig laden und überprüfen! [Windows OS]

Beitrag von diceman »

Sehr nützlich, in der Tat. :allright:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Lord
Beiträge: 290
Registriert: 21.01.2008 19:11

Re: [Source] Fonts richtig laden und überprüfen! [Windows OS]

Beitrag von Lord »

Hm.

Wenn ich in der Procedure Main() folgende Änderung vornehme:

Code: Alles auswählen

AllocFont("Arial",32)
zu

Code: Alles auswählen

AllocFont("al",-32)
wird gemledet
Font loaded!

Code: Alles auswählen

      Debug PeekS(@lf\lfFaceName[0])
      Debug Name
in AllocFont() nach GetObject_() eingefügte Debug melden
al
al
Font loaded!
Windows hat doch die Eigenart, daß es einen annähernd passenden Font liefert, wenn
der eigentliche Font nicht verfügbar ist.
Bild
Benutzeravatar
Mijikai
Beiträge: 698
Registriert: 25.09.2016 01:42

Re: [Source] Fonts richtig laden und überprüfen! [Windows OS]

Beitrag von Mijikai »

Danke für den Hinweis Lord.
Da habe ich ausversehen den falschen Code geposted.
Habe es korrigiert.

Viel Spass :)
Lord
Beiträge: 290
Registriert: 21.01.2008 19:11

Re: [Source] Fonts richtig laden und überprüfen! [Windows OS]

Beitrag von Lord »

Boah!
Ich wußte nicht, daß bei mir der Font "Arial" mit einer Größe
von 3200000 vorhanden ist. :wink:

"Alf" findet er allerdings nicht. :allright:
Bild
Benutzeravatar
Mijikai
Beiträge: 698
Registriert: 25.09.2016 01:42

Re: [Source] Fonts richtig laden und überprüfen! [Windows OS]

Beitrag von Mijikai »

Lord hat geschrieben: 15.05.2021 17:32 Boah!
Ich wußte nicht, daß bei mir der Font "Arial" mit einer Größe
von 3200000 vorhanden ist. :wink:
...
Da der Font vorhanden ist wird er auch geladen.
Wenn die Größe ein Kriterium wäre würden wohl fast alle Font Requests fehlschlagen.
Es wird immer die nächst mögliche Größe automatisch ausgewählt.
Natürlich könnten auch noch alle Größen überprüft werden aber für mich reicht es so.
Antworten