Seitenleiste

Community

GUIs

Einstieg

Plattformübergreifend

Konsolenbasiert

Textausgabe

Nun wird es endlich spannender, es geht nun darum, Text auf dem Bildschirm zu platzieren. Grundsätzlich ist die Prozedur, den Cursor dahin zu setzen, wo die Ausgabe ist, die Zeichen in die Fensterstruktur zu schreiben und das Fenster auf den Bildschirm zu aktualisieren.

Ein Zeichen wird in NCurses mit dem Datentyp chtype dargestellt.

Der Cursor

Der Cursor bestimmt, wo die Console Ein- und Ausgaben erwartet. Entsprechend muss der Cursor zunächst an die Stelle gestellt werden, an der eine Ausgabe erfolgen soll. Dafür gibt es die Funktion move(). Zu Beachten ist, dass zuerst die Zeile und dann die Spalte angegeben wird.

Auf vielen Konsolen blinkt der Cursor oder invertiert ein Zeichen, um den Nutzer darauf aufmerksam zu machen, wo er eine Eingabe machen soll. Das ist nicht immer gewünscht und deswegen lässt sich der Cursor mit der Funktion curs_set() konfigurieren.

Ein Zeichen ausgeben

Um ein einzelnes Zeichen auszugeben, benutzt man die Funktion addch(). Dabei wird das Zeichen in das NCurses-Fenster geschrieben und überschreibt dabei das Zeichen, das zuvor an dieser Stelle stand. Im NCurses-Fenster werden alle Ausgaben abgelegt, um die Ausgabe allerdings auf dem Monitor zu sehen, muss der Bildschirm mit refresh() aktualisiert werden.

move( 1, 1 );
addch( 'A' );
refresh();

Es gibt Funktionen mit kombinierten move(): mvaddch(), bzw. um ein Zeichen in ein konkretes Fenster auszugeben: waddch() und sogar, um move() und Fensterzu bestimmen: mvwaddch()

Ein Zeichen sofort ausgeben

Um sich den Aufruf von refresh() zu sparen, kann die Funktion echochar() verwendet werden. Eine Funktion zum gleichzeitigen Setzen des Cursors gibt es hierbei leider nicht, allerdings lässt sich mit wechochar() das Ausgabefenster festlegen.

move( 1, 1 );
echochar( 'A' );

Die Tatsache, dass bekannt ist, dass nur ein Zeichen ausgegeben wird, bedeutet, dass nicht der vollständige Bildschirm aktualisiert werden muss. Dieses Wissen kann die Ausgabe deutlich beschleunigen.

Ein Zeichen einfügen

Die bisherigen Funktionen addch() und echochar() überschreiben das Zeichen auf dem Bildschirm. Möchte man jedoch ein Zeichen einfügen und damit das Zeichen an der Cursorposition nach rechts verschieben, so verwendet man insch().

Eine Zeichenkette ausgeben

Oftmals möchte man natürlich eine ganze Zeichenkette ausgeben. Wie zuvor wird die Zeichenkette dem Fenster hinzugefügt und wird nicht direkt auf den Bildschirm geschickt. Auch hier kann zunächst das Fenster in den gewünschten Zustand gebracht werden und anschließend refresh() aufrufen, um alle Änderungen in einem Rutsch auf den Bildschirm zu bringen.

Im Gegensatz zu addch(), wird hier ein Standard-C-String übergeben.

Um eine Zeichenkette auszugeben wird die Funktion addstr() verwendet. Möchte man aus einer Zeichenkette nur bis zu einen bestimmten Zeichen ausgeben, so wird die Funktion addnstr() verwendet.

addstr( "Hallo Welt" );      // gibt "Hallo Welt" aus
addnstr( "Hallo Welt", 5 );  // gibt "Hallo" aus

Es gibt Entsprechungen, um in ein Fenster zu schreiben (waddstr(), waddnstr()), um den Cursor vorher zu positionieren (mvaddstr(), mvaddnstr()) oder das ganze in Kombination (mvwaddstr(), mvwaddnstr()).

Eine Zeichenkette einfügen

Entsprechend zu insch() kann man auch Zeichenketten einfügen, so dass die Zeichen hinter dem Cursor nach rechts verschoben werden. Um eine Zeichenkette einzufügen verwendet man insstr(). Wie bei addstr(), lässt sich die Länge der einzufügenden Zeichenkette begrenzen:

insstr( "Hallo Welt" );      // fügt "Hallo Welt" ein
insnstr( "Hallo Welt", 5 );  // fügt "Hallo" ein

Auch hier gibt es Entsprechungen, um in ein Fenster zu schreiben (winsstr(), winsnstr()), um den Cursor vorher zu positionieren (mvinsstr(), mvinsnstr()) oder das ganze in Kombination (mvwinsstr(), mvwinsnstr()).

Formatierte Ausgabe

Die Ausgabemöglichkeiten der Standard-C-Library dürfen wir in Verbindung mit NCurses ja nicht verwenden. Dabei würde man vor allem die Funktion printf() vermutlich sehr vermissen. Diese Möglichkeiten haben die NCurses-Entwickler vermutlich auch vermisst und dafür die Funktion printw(), die genauso wie printf() funktioniert.

printw( "%d * %d = %d", 3, 4, 3*4 );

Auch hier gibt es Funktionen, um den Cursor zu positionieren (mvprintw()) und/oder in ein vorausgewähltes Fenster (mvwprintw()/wprintw()]] auszugeben. Bei eigenen Funktionen mit variabler Argumentenliste lässt sich die Argumentenliste mit der Funktion vwwprintw() einbringen.

Der Format-String wird bei allen Format-Funktionen mit der stdio-Library erstellt, entsprechend gelten die gleichen Regeln.