1. Aufgabenstellung

  2. Kurzübersicht über wichtige Funktionen

  3. Demoprogramm

C-KURS WS 01/02 - Übung 12 - Einfache Fensteroperationen


AUTHOR: Gerd Döben-Henisch
DATE OF FIRST GENERATION: Dec-15, 2001
DATE OF LAST CHANGE: Dec-17, 2001
EMAIL:
Gerd Döben-Henisch

1. Aufgabenstellung

Die Verbindung (= Schnittstelle/ Interface) zwischen einem C-Programm und seinem Benutzer wird bei einem reinen ISO-C-Programm über die Tastatur und einem zeilenbasierten Textfenster realisiert. Dies ist wenig komfortabel.

Unter UNIX (und speziell auch LINUX) gibt es die Möglichkeit, mit vergleichsweise wenig zusätzlichem Aufwand und ohne grosse Grafikbibliotheken den üblichen textbasierten Terminals etwas mehr 'Leben' einzuhauchen, um auf diese Weise die visuelle Gestaltung des Bildschirms und damit die Interaktion mit dem Benutzer benutzerfreundlicher zu gestalten. Dies wird ermöglicht durch die Funktionen der Bibliothek ncurses, zu der die Headerdatei curses.h gehört.

Aus diesem Grund soll in dieser Lehreinheit das Gebiet des reinen ISO-Cs kurzfristig verlassen werden, um zu zeigen, über welche wirkungsvollen Mittel ein C-Programmierer unter UNIX/LINUX verfügt.

START


2.Kurzübersicht über wichtige Funktionen

Eine Liste aller verfügbaren Funktionen der Bibliothek ncurses bekommt man, wenn man unter UNIX in einem Shellfenster info ncurses oder man ncurses eingibt.

Details zu den einzelnen Informationen erhält man, wenn man sich aus der Liste der Funktionen einen Funktionsnamen auswählt (z.B. 'initscr') und wiederum den Befehl info initscr oder man initscr eingibt.

Für diese Übung werden wir uns nur einige wichtige Funktionen auswählen, da der Umfang von ncurses zu gross ist, um in dem verfügbaren Zeitrahmen vollständig behandelt werden zu können. Dies ist soll aber nicht abschrecken. Schon mit einigen wenigen Funktionen kann man nützliche Ergebnisse erzielen.

Hier eine Auswahlliste von Funktionen:


F-NAME

MV-PRÄFIX

MV := move := Eingabe einer Position für die Aktion

(MV)W-PRÄFIX

W := window := Angabe eines Fensters für die Aktion

ANWENDUNG und BEDEUTUNG



wattrset

wattrset(f3, A_BOLD | A_BLINK);

Im Fenster 'f3' wird die Schrift mit den Attributen 'BOLD' und 'BLINKEN' ausgestattet



wattroff

wattroff(f3, A_BOLD | A_BLINK);

Im Fenster 'f3' werden die Attribute 'BOLD' und 'BLINKEN' wieder abgeschaltet

clear



clear();

Löscht alle Inhalte des Hauptfensters

delwin



dlwin(f3); Zertört das Fenster f3

endwin



endwin(); Zertört das Hauptfenster = stdscr = Standardscreen

getch


mvwgetch

c=mvwgetch(command,1,2);

c bekommt bei eingabe ein Zeichen von den Koordinaten y=1 und x=2 des Fensters 'command'

getnstr

mvgetnstr

mvgwetnstr

mvgetnstr(11,10,input,MAX_LINE);

Ab den Koordinaten y=11, x=10 werden vom Hauptfenster maximal MAX_LINE-viele Zeichen in den String input eingelesen

init_pair



init_pair(3,COLOR_BLUE,COLOR_WHITE);

Es wird das Farbpaar Nr.3 definiert: Hintergrundfarbe Weiss und Schriftfarbe Blau.

wattrset(action,A_BOLD|COLOR_PAIR(3));

Im Fenster 'action' wird das Farbpaar Nr.3 aktiviert, zusätzlich wird Fetttschrift eingeschaltet

initscr



initscr();

Das Hauptfenster (= stdsrc = Standardscereen) wird aktiviert

insdelln



insdelln(-2);

Löscht zwei Zeilen unter der aktuellen Cursoposition

move



move(10,20);

Bewegt den Cursor im Hauptfenster zur Position y=10,x=20

newwin



box




action=newwin(4,28,5,15);

Erzeugt im Hauptfenster das Fenster 'action' mit 4 Zeilen, 28 Spalten und mit der linken oberen Ecke an der Position y=4, x=15

box(action,ACS_VLINE, ACS_HLINE);

Das Fenster 'action' wird vertikal mit Linienelementen vom Typ ACS_VLINE umgeben und horizontal mit Linienelementen vom Typ ACS_HLINE

noecho

echo



noecho(); Eingetippte Zeichen werden nicht angezeigt

echo(); Schaltet Echo wieder ein

printw


mvprintw

mvwprintw

printw entspricht im Prinzip dem Befehl printf, nur dass eben nicht in die Standardausgabe stdout gedruckt wird, sondern in den Standardscreen stdscr.

Mit dem Präfix 'mv-' besteht die Möglichkeit, zusätzlich die Position im Fenster anzugeben, ab der gedruckt werden soll.

Das Infix '-w-' erlaubt, zusätzlich noch das Fenster anzugeben, in dem gedruckt werden soll.

mvwprintw(f3,1,5,"Hallo");

Druckt an der Position y=1, x=5 im Fenster f3 die Zeichenkette "Hallo"

refresh

wrefresh



refresh(); Erneuert alle Anzeigedaten für das hauptfenster.

wrefresh(f3), Erneuert die Anzeigedaten für das Fenster 'f3'

start_color



start_color(); Aktivierung der Standardfarben (8 Farben)

wclear



wclear(f3), Löscht alle Inhalte des Fensters 'f3'


mvwin


mvwin(f3, 10,20);

Verschiebt das Fenster 'f3' so, das die linke obere Ecke in der neuen Position bei y=10, x=20 liegt



START


Demoprogram

Das Program term1.c ist ein einfaches Demoprogram, in dem die Funktionsweise der zuvor genannten Befehle im Zusammenhang vorgestellt wird.

Dieses Programm sollte im Prinzip selbserklärend sein. Man sollte sich nur die folgenden grundlegenden Rahmenbedingungen immer vor Augen halten:

Es wird grundsätzlich unterschieden zwischen dem Hauptfenster (Standardscreen = stdscr) und Fenstern innerhalb des Hauptfensters ('Unterfenster').

Aktionen, die sich auf ein Unterfenster beziehen, haben als Zusatz im Befehlsnahmen immer ein kleines 'w'. So druckt der Befehl printw() Text in das Hauptfenster. Der Befehl wprintw(f1,...) tut das Gleiche, nur druckt er in das Unterfesnter 'f1'. Beiden Befehlen kann nun noch das Präfix 'mv' vorgesetzt werden. So z.B. mvprintw(y,x,...) bzw. mvwprintw(f1,.y,x, ..). Im ersten Fall wird im Hauptfenster ab der Position (y,x) gedruckt, und im zweiten Fall im Unterfenster f1 ab der Position (y,x).

Ferner gilt, dass Jede Aktion in einem Fenster nur sichtbar wird, wenn man einen Refresh()-Befehl erteilt hat. refresh() bezieht sich auf das Hauptfenster, wrefresh(f1) auf das Unterfenster f1.

Fenster müssen vor Gebrauch geöffnet (initscr() für Hauptfenster, f1=newwin() für Unterfenster) und vor Beendigung des Programms wieder geschlossen werden (delwin(f1) für Unterfenster und endwin() für Hauptfenster).

START