Darstellung erweiterter ASCII-Codes mit DrawText
-
- Beiträge: 26
- Registriert: 05.11.2006 22:01
- Kontaktdaten:
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.
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.
Besser ist es den Font mitzuliefern ! Geh' lieber nicht davon aus, dass ein Font schon vorhanden ist.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.
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
Gruss Andreas
-
- Beiträge: 26
- Registriert: 05.11.2006 22:01
- Kontaktdaten:
@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.
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.
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.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.
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.
Gruss Andreas
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
-
- Beiträge: 26
- Registriert: 05.11.2006 22:01
- Kontaktdaten:
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
-
- Beiträge: 26
- Registriert: 05.11.2006 22:01
- Kontaktdaten:
...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:
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!?
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.