Seite 1 von 1

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

Verfasst: 13.05.2021 12:40
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 :)

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

Verfasst: 14.05.2021 19:09
von diceman
Sehr nützlich, in der Tat. :allright:

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

Verfasst: 15.05.2021 12:51
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.

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

Verfasst: 15.05.2021 14:52
von Mijikai
Danke für den Hinweis Lord.
Da habe ich ausversehen den falschen Code geposted.
Habe es korrigiert.

Viel Spass :)

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

Verfasst: 15.05.2021 17:32
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:

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

Verfasst: 15.05.2021 18:16
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.