C-KURS WS 01/02 - Übung 12 - Einfache FensteroperationenAUTHOR: 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.
|
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 |
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).
|