====== 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 [[gui:ncurses:lib: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 [[gui:ncurses:lib: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 [[gui:ncurses:lib:curs_set()]] konfigurieren. ===== Ein Zeichen ausgeben ===== Um ein einzelnes Zeichen auszugeben, benutzt man die Funktion [[gui:ncurses:lib: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 [[gui:ncurses:lib:refresh()]] aktualisiert werden. move( 1, 1 ); addch( 'A' ); refresh(); Es gibt Funktionen mit kombinierten [[gui:ncurses:lib:move()]]: [[gui:ncurses:lib:mvaddch()]], bzw. um ein Zeichen in ein konkretes Fenster auszugeben: [[gui:ncurses:lib:waddch()]] und sogar, um [[gui:ncurses:lib:move()]] und Fensterzu bestimmen: [[gui:ncurses:lib:mvwaddch()]] ==== Ein Zeichen sofort ausgeben ==== Um sich den Aufruf von [[gui:ncurses:lib:refresh()]] zu sparen, kann die Funktion [[gui:ncurses:lib:echochar()]] verwendet werden. Eine Funktion zum gleichzeitigen Setzen des Cursors gibt es hierbei leider nicht, allerdings lässt sich mit [[gui:ncurses:lib: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 [[gui:ncurses:lib:addch()]] und [[gui:ncurses:lib: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 [[gui:ncurses:lib: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 [[gui:ncurses:lib:refresh()]] aufrufen, um alle Änderungen in einem Rutsch auf den Bildschirm zu bringen. Im Gegensatz zu [[gui:ncurses:lib:addch()]], wird hier ein [[glossary:cstring|Standard-C-String]] übergeben. Um eine Zeichenkette auszugeben wird die Funktion [[gui:ncurses:lib:addstr()]] verwendet. Möchte man aus einer Zeichenkette nur bis zu einen bestimmten Zeichen ausgeben, so wird die Funktion [[gui:ncurses:lib: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 ([[gui:ncurses:lib:waddstr()]], [[gui:ncurses:lib:waddnstr()]]), um den Cursor vorher zu positionieren ([[gui:ncurses:lib:mvaddstr()]], [[gui:ncurses:lib:mvaddnstr()]]) oder das ganze in Kombination ([[gui:ncurses:lib:mvwaddstr()]], [[gui:ncurses:lib:mvwaddnstr()]]). ==== Eine Zeichenkette einfügen ==== Entsprechend zu [[gui:ncurses:lib: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 [[gui:ncurses:lib:insstr()]]. Wie bei [[gui:ncurses:lib: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 ([[gui:ncurses:lib:winsstr()]], [[gui:ncurses:lib:winsnstr()]]), um den Cursor vorher zu positionieren ([[gui:ncurses:lib:mvinsstr()]], [[gui:ncurses:lib:mvinsnstr()]]) oder das ganze in Kombination ([[gui:ncurses:lib:mvwinsstr()]], [[gui:ncurses:lib:mvwinsnstr()]]). ==== Formatierte Ausgabe ==== Die Ausgabemöglichkeiten der [[c:lib:|Standard-C-Library]] dürfen wir in Verbindung mit NCurses ja nicht verwenden. Dabei würde man vor allem die Funktion [[c:lib:stdio:printf()]] vermutlich sehr vermissen. Diese Möglichkeiten haben die NCurses-Entwickler vermutlich auch vermisst und dafür die Funktion [[gui:ncurses:lib:printw()]], die genauso wie [[c:lib:stdio:printf()]] funktioniert. printw( "%d * %d = %d", 3, 4, 3*4 ); Auch hier gibt es Funktionen, um den Cursor zu positionieren ([[c:lib:stdio:mvprintw()]]) und/oder in ein vorausgewähltes Fenster ([[c:lib:stdio:mvwprintw()]]/[[c:lib:stdio:wprintw()]]]] auszugeben. Bei eigenen Funktionen mit [[c:lib:stdarg:start|variabler Argumentenliste]] lässt sich die Argumentenliste mit der Funktion [[c:lib:stdio:vwwprintw()]] einbringen. Der Format-String wird bei allen Format-Funktionen mit der [[c:lib:stdio:|stdio-Library]] erstellt, entsprechend gelten die gleichen [[c:lib:stdio:formatstring|Regeln]].