ein Kapitel zurück                                           ein Kapitel weiter

Im vorletzten Kapitel zu Curses wollen wir noch ein wenig die Fensterroutinen durchnehmen.

Fensterroutinen funktionieren genauso wie die schon Kapitel zuvor besprochenen Funktionen nur wird Ihnen noch ein Zeiger auf die WINDOW - Struktur übergeben und zusätzlich bekommen Funktionen die sich auf Fenster beziehen das Präfix 'w' z.B. aus printw wird...

wprintw(WINDOW *win, char *format, ...)  

...oder aus mvprintw() wird...

mvwprintw(WINDOW *win, int y, int x, char *format, ...);  

usw. Funktionen die also mit dem mv-Präfix werden somit zu mvw-Präfixen. Einfach bei allen Funktionen die sie kennen das w oder mvw und die WINDOW -Struktur übergeben. Falls sie sich nicht sicher sind schauen sie sich einfach die man-Pages dazu an. Z.B. geben sie 'man getch' ein und sie werden auch die Routine für getch = wgetch für Fenster finden. Da alle bisher erlernten Funktionen somit genauso Funktionieren wie schon erklärt ersparen wir uns die genaue Beschreibung.

WINDOW *newwin(int anzahl_zeilen, int anzah_Spalten, int cursor_y, int cursor_X);  

Mit newwin erstellen wir ein neues Fenster mit anzahl_zeilen und anzahl_spalten. Dies machen wir mit...

stdscr=newline(anzahl_zeilen,anzahl_spalten,0,0)

int box(WINDOW *win, chtype zeichenvertikal, chtype zeichenhorizontal);  

Mit box() können sie einen Rahmen um das Fenster win legen. z.B....

fenster=newwin(10,79,0,0);   //Fenster mit dem Namen Fenster 10 Zeilen und 79 Spalten gross
box(fenster,ACS_VLINE,ACS_HLINE);   //Linien um den Fensterbereich ziehen eine Box  

Die ACS_ - Zeichen und den Datentyp chtype haben sie bereits kennen gelernt.

Selbiges wie mit der Funktion box() könnten sie auch mit den Funktionen.....

int hline(chtype zeichen, int n);
int vline(chtype zeichen, int n);  



WINDOW *dupwin(WINDOW *win);  

Damit können sie eine Kopie des WINDOW win machen. Beispiel....

fenster2=dupwin(fenster1);  

Wenn man dieses Fenster nicht mehr benötigt so muss man dies mit.....

int delwin(WINDOW *win);  

...wieder freigeben. Beispiel...

delwin(fenster2);  

Wenn sie ein Fenster verschieben wollen machen sie dies mit....

int mvwin(WINDOW *win, int y, int x);  

Als Ausgangspunkt wird die linke obere Ecke genommen. Diese Ermitteln wir, falls nicht bekannt, mit der Funktion.......

void getbegyx(WINDOW *win, int y, int x);  

Achtung auch hier gilt nicht den Adressoperator '&' für die Variablen y und x einzusetzen. Wir wollen den Bildschirm z.B. von der aktuellen Position 3 Zeilen tiefer und 10 Spalten nach rechts setzten........

int y,x;
getbegyx(fenster1,y,x);
mvwin(fenster1,y+3,x+10);  

Um die gesamte Größe eines Fensters zu ermitteln gibt es die Funktion.....

int getmaxyx(WINDOW *win, int y, int x);  

Auch hier benötigen sie für die Variablen y und x keinen Adressoperator.

Manchmal wenn wir die Funktion refresh() benötigen um den gesamten Fensterinhalt neu zu zeichnen benötigen wir eine Funktion die unser Fenster als verändert markiert. Den refresh() zeichnet nur dann neu wenn sich auf dem Bildschirm etwas verändert. Dies machen wir mit der Funktion....

int touchwin(WINDOW *win);  

Den Standartbildschirm stdscr können sie nun mittels refresh neu zeichnen. Bei anderen Fenstern benötigen wir.....

wrefresh(WINDOW *win);  

Beispiel : wrefresh(fenster1);
Falls sie überprüfen wollen ob sich auf dem Fenster etwas verändert hat können sie dies mit der Funktion...... int is_wintouched(WINDOW *win); ...abfragen. Beispiel....

if(is_wintouched(fenster1))   //wurde Fenster verändert
    wrefresh(fenster1);   //dann zeichne neu else   //ansonsten...
     {
       touchwin(fenster1);   //tu so wie wenn das Fenster verändert wurde
       wrefresh(fenster1);   //und zeichne dann neu
     }

int overwrite(const WINDOW *quelle, WINDOW *ziel);
int overlay(const WINDOW *quelle, WINDOW *ziel);  

Beide Funktionen kopieren (nur) die Zeichen vom Fenster quelle ins Fenster ziel. Der Unterschied der beiden Funktionen liegt daran das overlay() kein Leerzeichen mitkopiert. Jetzt wollen wir noch ein Programm schreiben das die meisten unserer Fensterfunktionen selbsterklärend darstellen soll. Das Programm hält nach jedem kleinen Beispiel an. Bitte drücken sie eine Taste um zur nächsten Funktion im Programm zu springen.......

/*Download:cur12.c*/
#include <curses.h> #define schwarz 0 #define rot 1 #define gruen 2 #define gelb 3 #define blau 4 #define lila 5 #define hblau 6 #define weiss 7 /*zeigt uns alle möglichen Farbpaare an*/ void show_all_pairs() { int farbe1,farbe2,i=1,c; mvprintw(1,1,"Darstellung aller Farbenpaare : \n"); if(has_colors()==TRUE) { start_color(); for(farbe1=weiss; farbe1>=schwarz; farbe1--) for(farbe2=schwarz; farbe2<=weiss; farbe2++) { init_pair(i,farbe1,farbe2); attrset(COLOR_PAIR(i)); printw(" %d ",i++); } } noecho(); c=getch(); } /*Erzeugen ein neues Fenster mit sämtlichen Attributen*/ WINDOW *create_new_window(WINDOW *neues_fenster, int zeilen, int spalten, int hinterg, int vorderg, int begin_y, int begin_x, char *text, int text_y, int text_x) { neues_fenster=newwin(zeilen,spalten,begin_y,begin_x); init_pair(1,hinterg,vorderg); wattrset(neues_fenster,COLOR_PAIR(1)); box(neues_fenster,ACS_VLINE,ACS_HLINE); mvwprintw(neues_fenster,text_y,text_x,text); return neues_fenster; } int main() { WINDOW *fenster1,*fenster2,*fenster3; int y,x,max_y,max_x; initscr(); raw(); keypad(stdscr,TRUE); if(has_colors() == TRUE) start_color(); show_all_pairs(); clear(); refresh(); fenster1=create_new_window(fenster1,11,50,blau,weiss,0,0,"Hallo Welt",5,20); keypad(fenster1,TRUE); wrefresh(fenster1); wgetch(fenster1); fenster2=create_new_window(fenster2,10,50,rot,gruen,11,30,"Fenster 2",1,1); keypad(fenster2,TRUE); wrefresh(fenster2); wgetch(fenster2); mvwprintw(fenster1,5,5,"Wir verschieben Fenster 2 mit mvwin()"); wrefresh(fenster1); wgetch(fenster1); getbegyx(fenster2,y,x); /*Wo ist das Fenster 2 genau*/ touchwin(stdscr); /*stdscr neuzeichnen*/ refresh(); /*Fenster 3 Zeilen tiefer und 20 Spalten nach links.*/ mvwin(fenster2,y+3,x-20); /*Da Fenster 1 nicht verändert wurde und wir neu zeichnen wollen*/ touchwin(fenster1); wrefresh(fenster1); wrefresh(fenster2); wgetch(fenster2); mvwprintw(fenster1,5,5," Wir löschen Fenster 2 mit delwin() "); wrefresh(fenster1); wgetch(fenster1); delwin(fenster2); /*Löscht Fenster 2*/ touchwin(stdscr); refresh(); mvwin(fenster1,0,0); wrefresh(fenster1); wgetch(fenster1); mvwprintw(fenster1,5,5,"Wir kopieren dieses Fenster mit dupwin()"); wrefresh(fenster1); wgetch(fenster1); fenster2=dupwin(fenster1); mvwin(fenster2,12,0); wrefresh(fenster2); wgetch(fenster2); mvwprintw(fenster1,5,1," Fenster 1 wird nun geloescht "); wrefresh(fenster1); wgetch(fenster1); delwin(fenster1); touchwin(stdscr); refresh(); touchwin(fenster2); wrefresh(fenster2); wgetch(fenster2); attrset(COLOR_PAIR(0)); mvprintw(1,1,"Nun wird das letzte Fenster auch noch beendet"); refresh(); wgetch(fenster2); delwin(fenster2); touchwin(stdscr); refresh(); mvprintw(1,1,"Jetzt ist nur noch das Fenster stdscr in Betrieb!"); getch(); endwin(); return 0; }

Zugegeben das Programm ist keine Wucht aber zur Demonstration ist genau was wir benötigen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf