Seite 2 von 3
Verfasst: 10.11.2006 18:02
von johnnysnet
Ich wollte das auch so machen, dass ich einen Font mitliefere. Hab ihn mit IncludeBinary eingebunden und dann im Fonts-Ordner von Windows eine Datei erstellen lassen und mit WriteData den ganzen Spaß reingeschrieben. Jedoch konnte ich ihn nicht laden, da der interne Name auch "Terminal" war, wie schon ein Font im System. Durch den doppelten Namen hatte mir LoadFont den bereits im System enthaltenen Font geladen und das brachte mir so nichts. Dann wollte ich nach einem Tool suchen, dass Zeichensätze im Fon-Format öffnen und bearbeiten kann, damit ich den internen Namen ändern kann, bin aber nicht fündig geworden.
Jetzt werde ich den im System enthaltenen Terminal Font verwenden, in der Hoffnung, dass der in den meisten Systemen enthalten ist. Mit dem Trick, dass ich die Höhe und Breite der Zeichen per TextWidth und TextHeight aus der 2DDrawing-Library überprüfen kann, stelle ich zumindest sicher, dass der geladene Font eine einheitliche Zeichenbreite hat und im gewünschten Größenformat vorliegt.
Warum verwende ich nur ASCII-Zeichen für meine Application? Nun - damals schrieb ich im Consolenmodus einen Chat, der dateibasiert war und jetzt möchte ich eine neue Version dessen im Windows-Fenster schreiben, die sich grundlegend nicht unterscheidet. Es gefällt mir so und es ist bequem, keine Grafikoperationen durchführen zu müssen. Console deshalb nicht mehr, weil ich keine Lösung für das Problem fand, dass der Anwender das Fenster einfach schließen konnte, ohne das die Anwendung es "mitkriegt".
Dass ich durchaus gewillt bin, bei Bedarf auch die Funktionen wie Box oder Line zu verwenden, zeigt ja mein Sudoku-Code im anderen Thread, bei welchem das Rätsel auf solch eine Weise in ein Image gezeichnet wird.
Verfasst: 12.11.2006 12:05
von Andreas
johnnysnet hat geschrieben:
Jetzt werde ich den im System enthaltenen Terminal Font verwenden, in der Hoffnung, dass der in den meisten Systemen enthalten ist. Mit dem Trick, dass ich die Höhe und Breite der Zeichen per TextWidth und TextHeight aus der 2DDrawing-Library überprüfen kann, stelle ich zumindest sicher, dass der geladene Font eine einheitliche Zeichenbreite hat und im gewünschten Größenformat vorliegt.
Besser ist es den Font mitzuliefern ! Geh' lieber nicht davon aus, dass ein Font schon vorhanden ist.
Du musst den mitgelieferten Font nur in Windows ''anmelden''.
Hier findest Du ein Beispiel ( mit Font ). Ich hoffe Du findest durch den Code, ist ja eigentlich nicht so schwer.
http://www.ampsoft.eu/purebasic/data/Console.zip
Verfasst: 12.11.2006 12:11
von #NULL
RemoveFontResource_(filename$)
wäre nach selbst-eingeschleptem aber auch noch angebracht

<edit: hab ich übersehen, sorry>
Verfasst: 12.11.2006 15:21
von johnnysnet
@Andreas
Dein Beispiel ist sehr übersichtlich und ich habe es verstanden. Dankeschön dafür. Es bleibt leider nur das Problem bestehen, dass ich bereits einen Font mit dem internen Namen "Terminal" im System habe. Ich habe dein Beispiel ausgeführt und während das Programm lief im Fonts Ordner nachgeschaut, ob ich den neuen Font finden kann. Leider tauchte von diesem weder der interne, noch der Dateiname dort auf (für Letzteren habe ich natürlich die Detailansicht gewählt.) Deshalb bin ich unsicher, ob die Funktion AddFontResource_() korrekt arbeitet.
Meine Variante, die den eingebundenen Font manuell ins Font Verzeichnis kopiert hat (mithilfe der API-Funktion GetWindowsDirectory), funktionierte definitiv nicht, obwohl ich den Font anschließend im Zielverzeichnis vorfand. Wenn ich nur eine Möglichkeit fänd, den internen Namen des Font zu ändern, dann wären die Probleme gelöst. Derartige Software habe ich noch nicht gefunden. Die Lösung, selbst Schriften zu kreieren wäre auch in Ordnung, doch die meisten Programme in dieser Kategorie können nur TrueType Fonts erzeugen.
Verfasst: 12.11.2006 15:31
von Andreas
johnnysnet hat geschrieben:@Andreas
Dein Beispiel ist sehr übersichtlich und ich habe es verstanden. Dankeschön dafür. Es bleibt leider nur das Problem bestehen, dass ich bereits einen Font mit dem internen Namen "Terminal" im System habe. Ich habe dein Beispiel ausgeführt und während das Programm lief im Fonts Ordner nachgeschaut, ob ich den neuen Font finden kann. Leider tauchte von diesem weder der interne, noch der Dateiname dort auf (für Letzteren habe ich natürlich die Detailansicht gewählt.) Deshalb bin ich unsicher, ob die Funktion AddFontResource_() korrekt arbeitet.
Der Font wird nirgends hinkopiert sondern nur in Windows angemeldet, der bleibt da wo er ist, Du kannst ihn also nicht im FONT-Ordner finden.
Du kannst auch überprüfen, ob die Funktion erfolgreich ausgeführt wurde. AddFontResource() gibt bei Erfolg die Anzahl der hinzugefügten Fonts zurück, sollte also grösser Null sein.
Verfasst: 12.11.2006 15:33
von Kaeru Gaman
*grübel*
...wenn er jetzt aber einen zeichensatz mit identischen internen namen bereits installiert hat...
gibt AddFontResource_() dann einen fehlercode zurück?
...oder ist das spezifisch zum filenamen...?
Verfasst: 12.11.2006 15:42
von johnnysnet
@Andreas
hatte ich ganz vergessen zu erwähnen: kurioserweise gibt die Funktion 4 zurück. Sind also 4 Fonts angemeldet worden?
Verfasst: 12.11.2006 15:49
von Kaeru Gaman
wenn man die schrift auf fett und kursiv stellen kann, ja.
Verfasst: 12.11.2006 16:16
von johnnysnet
...dann ist das wohl die sinnvollste Lösung mit
AddFontResource. Die Funktion arbeitet also offensichtlich auch dann, wenn der interne Name schon vorhanden ist. Fragt sich nur, welchen Zeichensatz man dann mit
LoadFont erwischt. Vielleicht wäre es sinnvoll, erst einmal zu prüfen, ob
LoadFont den Zeichensatz mit dem gewünschten Namen laden kann und erst wenn nicht, den mitgelieferten hinzuzufügen. Ich habe schonmal mit dem Projekt des neuen Chat's angefangen:
Code: Alles auswählen
Procedure.s CheckFont()
DC=GetDC_(WindowID(0))
SelectObject_(DC,FontID(0))
If DC
Result$=Space(255)
GetTextFace_(DC,255,@Result$)
EndIf
ProcedureReturn Result$
EndProcedure
Procedure DrawFont(Line.b,Column.b,Text.s,FColor.l,BColor.l)
CharToOem_(@Text,@Text)
DrawText((Column-1)*10,(Line-1)*19,Text,FColor,BColor)
EndProcedure
LoadFont(0,"Terminal",16)
OpenWindow(0,0,0,800,475,"Chat Tool 2",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If CheckFont()<>"Terminal"
;[]
EndIf
StartDrawing(WindowOutput(0))
DrawingFont(FontID(0))
DrawFont(1,1,"Bitte überzeugen Sie sich von der korrekten Darstellung dieses Textes äöüÄÖÜ",$FFFFFF,$990000)
StopDrawing()
Repeat
Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow
Jetzt würde man einfach an die Stelle nach der Abfrage, ob CheckFont() "Terminal" ergeben hat, die
AddFontResource einbauen. Vielleicht ist das so eine sinnvolle Sache!?
Verfasst: 12.11.2006 16:22
von Kaeru Gaman
das vorgehen wäre schon relativ sinnvoll, aber auch so hast du keine garantie,
dass der verhandene zeichensatz mit identischem internen namen optisch kompatibel ist.
(aber nagut, wenn du das einmal getestet hast,
eigentlich sollten die meisten leute denselben font namens "terminal" haben)
aber wenn du wirklich einen eigenen Font verwenden willst,
dann solltest du ihm wirklich einen einzigartigen internen namen geben,
also musst du dich dann wohl weit eingehender mit zeichensätzen beschäftigen.