Seite 1 von 1

LoadFont() mit nicht installierter TTF?

Verfasst: 01.08.2007 10:50
von gekkonier
Hallo, ist es möglich einen Font ins Programm zu laden, ohne dass dieser installiert ist? Ich möchte z.B. bei einer Anwendung oder einem Spiel einen Font als Datei mitliefern.

Wenn ich folgendes probiere:

Code: Alles auswählen

Enumeration
  #Crisp24
EndEnumeration

OpenConsole()

If LoadFont(#Crisp, "Data/Fonts/Criiiiisp.ttf", 24)
  PrintN("ladet")
Else
  PrintN("ladet nicht!")
EndIf

Input()

CloseConsole()
Erscheint "ladet", obwohl diese Datei z.B. nicht existiert! Ladet das Programm dann selbständig irgendeine installierte Datei wo Windows meint, dass es passen könnte, wie in der Hilfe beschrieben?
Hilfedatei von PB 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.
Falls es so sein sollte wäre das für meine Zwecke relativ mühsam (ich habe keine Lust irgendwas auf Zielcomputern zu installieren - nicht mal Fonts ;) -, nur damit meine Software läuft, und Bitmapfonts sind irgendwie auch nicht das wahre, falls es nun doch mal eine Fensteranwendung sein soll). In diesem Falle: Kennt jemand, oder hat jemand einen alternativen Font-Loader geschrieben, oder habe ich etwas in der Dokumentation überlesen?

Verfasst: 01.08.2007 11:12
von gekkonier
Okay, ich habe etwas im Codearchiv diesbezüglich gefunden, was ich mir mal näher ankucken werde!

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=1651&highlight=
; Author: GPI (updated for PB4.00 by blbltheworm)
; Date: 08. July 2003
; OS: Windows
; Demo: No

#Dir_Font = 0

Procedure LoadAdditionalFonts(Dir$) 
  ExamineDirectory(#Dir_Font,"Style\","*.TTF") 
  While NextDirectoryEntry(#Dir_Font) 
    AddFontResource_("Style\"+DirectoryEntryName(#Dir_Font)) 
  Wend 
  ExamineDirectory(#Dir_Font,"Style\","*.FON") 
  While NextDirectoryEntry(#Dir_Font) 
    AddFontResource_("Style\"+DirectoryEntryName(#Dir_Font)) 
  Wend 
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) 
EndProcedure 

Procedure UnLoadAdditionalFonts(Dir$) 
  ExamineDirectory(#Dir_Font,"Style\","*.TTF") 
  While NextDirectoryEntry(#Dir_Font) 
    RemoveFontResource_("Style\"+DirectoryEntryName(#Dir_Font)) 
  Wend 
  ExamineDirectory(#Dir_Font,"Style\","*.FON") 
  While NextDirectoryEntry(#Dir_Font) 
    RemoveFontResource_("Style\"+DirectoryEntryName(#Dir_Font)) 
  Wend 
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) 
EndProcedure  
Bonusfrage:
Gibts das auch für Linux u.ä.? :mrgreen:
Wobei mir das hier schon langt!

Verfasst: 01.08.2007 14:29
von gekkonier
Accent.ttf und Adlib.ttf müssen bei diesem funktionierendem Beispiel im selben Pfad wie das Programm sein:

Code: Alles auswählen

Procedure InstallAdditionalFonts(font$)
  AddFontResource_(font$)
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
EndProcedure

Procedure DeinstallAdditionalFonts(Font$)
  RemoveFontResource_(font$)
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
EndProcedure 

Gosub Init
Gosub Mainloop
Gosub Cleanup

End

Init:
  InstallAdditionalFonts("Accent.ttf")
  InstallAdditionalFonts("Adlib.ttf")
  LoadFont(0, "Accent", 20)
  LoadFont(1, "Adlib", 20)
  If OpenWindow(0, 100, 200, 250, 150, "Font Test") = 0
    MessageRequester("Failure!", "Replace user and hit anyone to continue!", 0)
    End
  EndIf
Return

Mainloop:
  Repeat
    Repeat
      EventID = WaitWindowEvent()
    Until EventID <> 0
    If EventID = #PB_Event_Repaint
      Gosub SomeGraphics
    EndIf
  Until EventID = #PB_Event_CloseWindow
Return

SomeGraphics:
  If StartDrawing(WindowOutput(0))
    DrawingMode(1)
    DrawingFont(FontID(0))
    DrawText(10,10, "Accent")
    DrawingFont(FontID(1))
    DrawText(10,100, "Adlib") 
    StopDrawing()
  EndIf
Return

Cleanup:
DeinstallAdditionalFonts("Accent")
Deinstalladditionalfonts("Adlib")

Verfasst: 01.08.2007 15:14
von HeX0R
Netter Monolog ;)
Programmierst du eigentlich wirklich in diesem abartigen Gosub/Return-Stil ?
Wenn ja, solltest du vielleicht mal umdenken.

Verfasst: 01.08.2007 15:47
von gekkonier
Tja, Monologe sind meine Stärke :lol:

gosub / return.....

verwende ich nur bei Prototypen / Beispielen, Code-Snippets.
In grösseren Programmen lagere ich solche Teile in eigene Dateien/Prozeduren aus. Wenn gosub/return so phöse ist wäre es mal sinnvoll alle mit PB mitgelieferten Beispiele zu überarbeiten, da wird das des öfteren verwendet.