Seite 1 von 1

"Menü" mittels Konsole?

Verfasst: 04.05.2021, 13:58
von starcow
Ich wusste jetzt nicht, wie ich es als Thread-Titel griffiger hätte auf Punkt bringen können...

"Früher" hatte man doch Programme, die sich irgendwie ausschliesslich dem "Konsolen-Character-Set" bedient haben. Oftmals waren z. B. die Installations- und Konfigurations-Menüs in alten Dos-Spielen so gelöst. Oder IDE's wie Quick-Basic. Ihr erinnert euch...

Gibt es vielleicht eine Möglichkeit, solche Menüs als Konsolen-Programm zu realisieren? Oder ist es sogar so, dass diese Programme tatsächliche nur Konsolen-Programme sind und der Output reiner Konsolen Output ist?

Bisher hatte ich irgendwie keine Möglichkeit gefunden, sowas wie ein "Fortschrittsbalken" in der Konsole zu realiseren. Dazu müsste man ja irgendwie den Bildschirm löschen können.
Wenn man das könnte, hätte man doch eine Art Möglichkeit, plattformunabhängige Programme zu erstellen, die trotzdem eine Art Menü aufweisen. Also Programme, die ganz ohne externe OS-API's auskommen.

Re: "Menü" mittels Konsole?

Verfasst: 04.05.2021, 14:07
von Schrompf
Du kannst Steuerzeichen ausgeben, die den Cursor (und damit die Stelle, wo Deine nächste Ausgabe losgeht) bewegen. Auf die Schnelle habe ich nur \r ergoogeln können, das setzt den Cursor an den Anfang der Zeile. Also zum Beispiel für nen Fortschrittsbalken

Code: Alles auswählen

printf( "XX00000000\r");
std::this_thread::wait(400ms);
printf( "XXXX000000\r");
std::this_thread::wait(400ms);
printf( "XXXXX00000\r");
Der printed also den Fortschrittsbalken mit 2X und geht dann gleich zurück an den Anfang der Zeile. 400ms später überschreibt dann die nächste Zeile mit einem X mehr all Deine Zeichen und setzt am Ende wieder den Cursor an den Anfang zurück. Und so weiter.

Gibt auch ein Steuerzeichen für "gehe eine Zeile hoch", und damit kannst Du dann mehrzeilige Sachen updaten, wie z.B. ein Menü

Achja, und es ist evtl. nötig, zu flushen, weil der sonst zeilenweise buffert und Du somit nie was von Deiner Ausgabe siehst. fflush( stdout); fällt mir da auf die Schnelle ein, aber das kannst Du sicher googeln.

Re: "Menü" mittels Konsole?

Verfasst: 04.05.2021, 16:19
von xq
ANSI Escape Sequenz ist hier das richtige Schlüsselwort, um crossplatform vernünftige Kontrolle über die Konsole zu haben. Oder direkt Libraries wie ncurses, welche dir das ganze abnimmt und quasi einen virtuelle Character-Framebuffer anbietet (und auch gleich das ganze UI mit)

Unter Windows kann man auch die Konsole direkt als Character-Framebuffer bearbeiten, hier ist WriteConsole und SetConsoleCursorPosition die richtigen Stichworte

Re: "Menü" mittels Konsole?

Verfasst: 04.05.2021, 16:48
von Jonathan
Für Fortschrittsbalken oder Prozentangaben hab ich mit \r immer gute Erfahrungen gemacht, das ist ziemlich simpel zu verwenden.
starcow hat geschrieben: 04.05.2021, 13:58 Wenn man das könnte, hätte man doch eine Art Möglichkeit, plattformunabhängige Programme zu erstellen, die trotzdem eine Art Menü aufweisen. Also Programme, die ganz ohne externe OS-API's auskommen.
Ich frage mich, was eigentlich deine Motivation ist? Wie schon erwähnt, hat man mit Bibliotheken wie ncurses sehr viel einfacher Kontrolle über die Ausgabe und kann damit viel machen. Aber wieso sollte das besser oder plattformunabhängiger sein, als andere Lösungen? Ich meine, der Compiler liefert dir halt für jede Plattform einfach eine Implementierung der Standardbibliothek mit - also eine plattformabhängige Bibliothek, deren Interface aber überall gleich ist. Letztendlich machen andere Bibliotheken wie z.B. Qt also genau das selbe, der einzige Unterschied ist, dass du sie erst noch installieren musst.

Re: "Menü" mittels Konsole?

Verfasst: 04.05.2021, 22:10
von Specialist
Visual Studio bietet in der stdio.h (meine ich zumindest dass es diese war) die Funktion gotoxy(int x, int y) mit der man den Cursor in der Konsole beliebig versetzen kann. So weit ich weiß ist das aber kein Standard.

Re: "Menü" mittels Konsole?

Verfasst: 07.05.2021, 16:51
von starcow
Interessant, danke! Damit lässt sich bereits etwas mehr machen :-)
Ich nehme an, farbige Textausgabe lässt sich nicht ohne seperate Bibliotheken realiseren.
Jonathan hat geschrieben: 04.05.2021, 16:48 Ich frage mich, was eigentlich deine Motivation ist? Wie schon erwähnt, hat man mit Bibliotheken wie ncurses sehr viel einfacher Kontrolle über die Ausgabe und kann damit viel machen. Aber wieso sollte das besser oder plattformunabhängiger sein, als andere Lösungen? Ich meine, der Compiler liefert dir halt für jede Plattform einfach eine Implementierung der Standardbibliothek mit - also eine plattformabhängige Bibliothek, deren Interface aber überall gleich ist. Letztendlich machen andere Bibliotheken wie z.B. Qt also genau das selbe, der einzige Unterschied ist, dass du sie erst noch installieren musst.
Ich verfolge jetzt nichts Konkretes. Es geht mir blos darum, den Gestaltungsspielraum etwas zu vergrössern. Also mit "Board-Mitteln", ohne externe Bibliotheken für kleinere Programme dazu einbinden zu müssen.

Edit:
Ich verstehe was du meinst Jonathan - da hast du eigentlich auch recht.

Gruss starcow

Re: "Menü" mittels Konsole?

Verfasst: 07.05.2021, 23:19
von Schrompf
Doch, Farbe geht auch. Das macht man über so obskure Textfragmente "[m\16x" oder so... müsste ich auch erst googeln.

Re: "Menü" mittels Konsole?

Verfasst: 10.05.2021, 14:07
von starcow
Tatsächlich! Danke für den Hinweis! (-:
Ascheinend muss man allerdings unter Windows dazu die Konsole irgendwie in einen speziellen Modus setzen. Ich glaube in anderen Betriebssystemen wird das per default unterstützt.