Hallo, weiß jemand wie ich mit C und den Escape- Sequenzen einen Text auf der Eingabeaufforderung in Farbe, z.B.: grün mache. lg und vielen Dank. Ernst
Schau mal nach ANSI TERMINAL erfordert natuerlich das dein Ausgabegerät auch ANSI TERMINAL kann.
Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5 Compilern.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/writeconsoleoutputattribute.asp http://www.developer.com/open/article.php/631241
Hallo, ich brauche jetzt auch Escape- Sequenzen. Ich habe ein Menü und hab mir einen Background eingeschalten mit \033[40m, ich kann diesen aber leider nicht mehr ausschalten sodass alle Menüpunkte einen schwarzen Hintergrund haben. Mache ich den Hintergrund mit \033[47 wieder weiß, so kann man die Menüpunkte nicht mehr sehen und der Hintergrund ist grau. Weis jemand, wie man die Attribute wieder ausschalten kann. Vielen Dank. lg Hannes
> Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5
Compilern.
Und was haben deiner Meinung nach ANSI Escape Sequenzen mit dem Compiler
zu tun ?
ich schreib diese nur in einen Buffer und schick diesen dann an einen VT100. Also ist das nicht so tragisch mit dem Compiler, der hat ja nichts zu tun damit.
Bartli wrote: >> Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5 Compilern. > > Und was haben deiner Meinung nach ANSI Escape Sequenzen mit dem Compiler > zu tun ? Das ist nicht meine Meinung, sondern das ist das Ergebnis das ich ausprobiert habe. Je nach Compiler werden die Escape Sequenzen garnicht oder nur teilweise ausgeführt. Visualstudio 6.0 igoriert die komplett, bei Dev Cpp (oder so ähnlich) gingen glaube ich nur die Escape Sequenzen für Farbe, nicht aber zum positionieren des Cursors. Ich habe dann einen fertigen Code aus dem Internet verwendet (conioex.cpp)
> Je nach Compiler werden die Escape Sequenzen garnicht > oder nur teilweise ausgeführt So ein Quatsch. Der Compiler ignoriert überhaupt nichts. Der Compiler generiert Code der genau das ausgibt, was in deinen Ausgabeanweisungen steht. Das Gerät an das du die Codes sendest kann die Codes ignorieren.
Wenn das so ist, dann erklär mal wieso das nicht mit jedem Compiler funktioniert ! Hier noch ein paar Beispiele: ESC[2J solle den Bildschirm löschen ESC[<farbe1>;<farbe2>m setzt die Textfarbe farbe1 und der Hintergrund farbe2 In c währe das dann: "\x1B[2J" und "\x1B[<farbe1>;<farbe2>m" Beides funktioniert nur bei manchen Compilern.
> Ich suche mal den Code, der lief in dieser Form nur auf manchen > Compilern. Frohes Suchen. Wenn du mir nachweisen kannst, dass es tatsächlichen einen Compiler gibt, der eine Ausgabe nicht so codiert, wie du sie programmiert hast, geb ich ein 'virtuelles Bier' aus. Muss allerdings Standard-C sein und das Pgm darf keine Fehler enthalten. Mann. Denk doch mal nach. Escape Sequenzen sind einfach nur Text, der ausgegeben wird. Spezieller Text zwar, aber doch einfach nur Text. Kein Compiler dieser Welt vergreift sich an deinem Ausgabetext.
> In c währe das dann: > "\x1B[2J" und "\x1B[<farbe1>;<farbe2>m" > > Beides funktioniert nur bei manchen Compilern. Wie beweist du mir das jetzt? Bis jetzt ist das nur eine Behauptung die ich nicht überprüfen kann. Auf allen Compilern die ich zur Verfügung habe, wird genau diese Sequenz ausgegeben wenn ich das ganze in einen printf packe und auf die serielle ausgeben lasse.
Nochmal: Du musst unterscheiden zwischen dem Compiler und dem Ausgabegerät, dass letztendlich die Ausgabe macht. Der Compiler wird den Ausgabestring auf keinen Fall ignorieren. Das wäre ein schwerer Compilerfehler! Allerdings kann das Ausgabegerät, auf dem die Ausgabe erfolgt, die Escape Sequenzen ignorieren! Ausgabegerät könnte zb auch das Konsolenfenster sein, dass mit deiner Entwicklungsumgebung mitkommt. Je nachdem, ob dort der ANSI.SYS aktiv ist oder nicht (oder etwas äquivalentes) kann es schon sein, dass dann nichts passiert. Das hat aber nichts mit dem COMPILER zu tun! Der Compiler übersetzt Code. Das ist seine Aufgabe und die macht er auch. Und wenn in meinem Programm drinnen steht, dass ich diesen oder jenen Text ausgeben möchte, dann ist es seine verdammte Pflicht diesen Text auch genauso an das Ausgabemedium weiterzuleiten. Was das Ausgabemedium dann damit macht, ist nicht mehr Sache des Compilers.
OK, ihr habt recht, der Compiler gibt das nur aus, aber eben auf unterschiedlichen Konsolenfenstern. Korrekt müsste es also heißen: "Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5 Entwicklungsumgebungen und/oder Betriebsystemen (mit den Standardeinstellungen)."
Ich würde es so formulieren: "Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5 Ausgabemedien und erfordert, dass das Ausgabemedium auch die ANSI-Codes versteht, was nicht immer der Fall ist." Ausgabemedium ist nicht nur Konsolenfenster (auch wenn der Thread damit gestartet wurde). Ausgbemedium ist auch ein externes Terminal, ein Drucker, ein Plotter, ein LCD, etc ...) Und in dieser Form gebe ich dir absolut recht. Selbst wenn wir von einer DOS-Box als Ausgabemedium reden (oder einem guten alten DOS) hängt es davon ab, ob dort der ANSI.SYS geladen wurde oder nicht. Letztendlich hängt es immer davon ab, ob ich mein Ausgabemedium soweit vorschreiben bzw. dessen Konfiguration beeinflussen kann, ob man dieses 'Risiko' eingeht oder nicht.
Die beste Lösung die ich bisher gefunden habe ist das hier, es war für mich sehr hilfreich da die normale Konsole ja nichtmal die einfachsten Formatierunsbefehle wie die Positionierung des Cursors bietet: http://www.c-plus-plus-archiv.de/archiv/show.ca/title/conioex/author/Geri/file/CONIOEX.ZIP/?offset=0&noclass=&nolist=&sort=type&dir=up&type=
Es gibt da noch eine kleine Stolperfalle, das wäre ob die File im Text oder im Binärmodus defaultmäßig geöffnet wird. Beim Binärmodus werden Escapesequenzen ignoriert. Der defaultmodus ist unterschiedlich zwischen Windows und Unix und z.B. bei cygwin einstellbar. siehe: http://sourceware.org/autobook/autobook/autobook_246.html
Im Zweifelsfall: Einfach mal die Verbindung herstellen, am Terminal auf die Taste drücken und vom Programm die empfangenen Hex-Codes ausgeben lassen.
Nö, das ist falsch! ASCII 13 ist zwar CR (Carriage Return), aber ASCII 27 ist ESC (Escape).
ASCII 27 ist "ESC". Die Funktionstasten der Tastatur sind freibelegbar. Das merkt man daran, dass man bspw. unter Excel damit eine Zelle bearbeiten kann und unter Word da scheinbar nichts passiert (ich jetzt nicht nachgeguckt, was da passiert). Die PC-Tastatur liefert übrigens Scancodes. Das sind zwei Bytes.
>Das sind zwei Bytes.
Nee, sind es doch nicht. Das muß was anderes gewesen sein (Unicode?).
Ein Terminalprogramm wie Hyperterminal emuliert ein echtes Terminal, wie beispielsweise ein VT100. Und das hat auch Funktionstasten F1..Firgendwas. Die senden, genauso wie die Cursortasten, beim Drücken eine Escape-Sequenz - also mehrere Zeichen. Welche das sind, sollte der VT100-Dokumentation entnommen werden können. Den Scancode der PC-Tastatur bekommt man als Nutzer eines Terminalprogrammes üblicherweise überhaupt nicht zu Gesicht, die sind hier nicht relevant. Auch ist die Tastaturbelegung unter anderen Programmen völlig irrelevant, das Terminalprogramm weist den Tasten eine eigene Bedeutung zu. Solche Programme wie das "Terminal"programm von Tobi oder "Bray" sind keine Terminalprogramme im klassischen Sinne, da sie kein Terminal emulieren.
Mit der Angabe, dass die Tastatur Scancodes liefert und verschiedene Programme die gleiche Taste unterschiedlich benutzen, wollte ich einfach nur aufzeigen, dass F4 eben nicht automatisch "ASCII 27" liefert.
es liegt wahrscheinlich eher daran das nur das erste byte der übertragung nach dem drücken von F4 angezeigt wurde. wie rufus schon sagte es sind mehrere zeichen. wenn man F1-F12 drückt wird man immer 27 bekommen, weil das immer das erste zeichen ist, aber auch nur das erste. gleiches gilt für cursor-tasten ... eine liste findet man beim suchen/googlen nach VT100
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.