ein Kapitel zurück                                           ein Kapitel weiter

Jetzt wollen wir Attribute setzen. Folgende Funktionen stehen uns zur Verfügung...

int attroff(int attribut);  

Ein Attribut das gesetzt wurde deaktivieren. z.B.:

attroff(A_BLINK);  

Blinken eines Textes oder Zeichens.... deaktivieren.

int attron(int attribut);  

Geeignet um zum Beispiel für einen String der schon ein Attribut bekommen hat ein weiteres zu aktivieren.

int attrset(int attribut);  

Damit setzten wir jedes beliebige Attribut bzw. mehrere. z.B:

attrset(A_BOLD | A_BLINK);
printw("Dieser Text wird FETT und BLINKEND angezeigt");  

Folgende Attribute können wir Verwenden :

Attribut Bedeutung
A_NORMAL  Normale Darstellung
A_STANDOUT   Zeichen stärkste Helligkeit
A_UNDERLINE  Zeichen unterstreichen
A_REVERSE      Invers
A_BLINK  blinken
A_DIM  Zeichen werden dunkler
A_BOLD    Fette Zeichen
A_PROTECT Geschützter Modus
A_INVIS    Unsichtbar
A_ALTCHARSET Umschalten auf Zeichengrafik
A_CHARTEXT  Macht aus dem 32Bit Wert (chtype) durch eine &-Verknüpfung einen 8Bit-Wert (ASCII)


COLOR_PAIR(n) Setzt Farbenpaare zusammen (Hintergrund und Schrift)

Bevor wir überhaupt Farbe für ein Programm verwenden wollen müssen wir erst mal testen ob überhaupt Farben verfügbar sind....

bool has_colors();  

Dies schreiben wir am besten...

if(has_colors==TRUE)
    /*Wir haben Farbe*/
else
    /*Wir haben keine Farbe*/  

Ein weitere Abfrage wäre die Funktion....

bool can_change_colors(void);  

Damit könne wir Abfragen ob wir die Farben vom Programm aus ändern können.

Falls wir Farbe haben (has_colors==TRUE) muss nach dem Aufruf von initscr() die Funktion....

int start_color(void);  

aufgerufen werden. Mit start_color() initialisieren wir die Farben und gleichzeitig die globale Variablen COLORS und COLOR_PAIRS. COLOR_PAIRS stellt ein Farbenpaar dar aus Hintergrund und Schriftfarbe. Folgende Farben sind in der Headerdatei curses.h folgendermaßen definiert....

#define COLOR_BLACK    0
#define COLOR_RED      1
#define COLOR_GREEN    2
#define COLOR_YELLOW   3
#define COLOR_BLUE     4
#define COLOR_MAGENTA  5
#define COLOR_CYAN     6
#define COLOR_WHITE    7  



int init_pair(short paarnummer, int zeichen, int hintergrund);  

Mit init_pair() legen sie eine Paarnummerfest die sie dann mit attrset Ausgeben können. z.B.

init_pair(1,COLOR_RED,COLOR_GREEN);  

Damit legen wir ein Paar mit roter Schrift und grünen Hintergrund fest. Das Paar hat die Nummer 1. Dies setzten wir wie folgt ein....

attrset(COLOR_PAIR(1));
printfw("Dieser Text wird mit roten Zeichen auf grünen Hintergrund ausgegeben.");  

...oder...

init_pair(2,COLOR_BLUE,COLOR_BLACK);
attrset(A_BOLD|COLOR_PAIR(2));
printw("Dieser Text wird mit fetter blauer Schrift "
       "und schwarzem Hintergrund ausgegeben.");  

Mit init_pair() können sie insgesamt 64 verschiedene Farbkombinationen festlegen. Nur das Farbpaar mit dem Index 0 (COLOR_PAIR(0)) kann nie geändert werden. Dieser Wert entspricht weisen Text auf Schwarzen Hintergrund.

Um z.B. herauszufinden welche Farbe in einem Farbpaar definiert wurde gibt es die Funktion...

int pair_content(short paarnummer, short *zeichenfarbe, short *hintergrundfarbe);  

Wozu soll das gut sein?
Nun es gibt eine Möglichkeiten alle Farbpaare auf einmal zu definieren... int farbe1,farbe2,i=1;

if(has_color==TRUE)
   {
     start_color();
     for(farbe1=COLOR_WHITE;farbe1>=COLOR_BLACK;farbe1--)   //WHITE=7;BLACK=0
       for(farbe2=COLOR_BLACK; farbe2<=COLOR_WHITE; farbe2++)
         init_pair(i++,farbe1,farbe2);
   }  

Damit werden alle 64 Farbenpaare auf einmal definiert. Um jetzt wissen zu wollen welchen Farbwert das Paar 50 hat brauchen wir nur.....

pair_content(50,&zeichenfarbe,&hintergrundfarbe);  

...an die Adressen der Variablen zeichenfarbe und hintergrundfarbe geben.

Jetzt wollen wir die Attribute und Farben auf unser Programm mit dem Raumschiff durchs Weltall loslassen.....

/*Download:cur11.c*/
#include <curses.h> #include <stdlib.h> /* 'q' */ #define QUIT 113 /* '<-' */ #define LEFT 260 /* -> */ #define RIGHT 261 int main() { int x=40,zufall, c,i,vor,hint; srand(79); initscr(); if(has_colors()==TRUE) start_color(); else exit (0); keypad(stdscr,TRUE); /*Cursor und Funktionstasten*/ noecho(); /*keine Ausgabe*/ scrollok(stdscr,TRUE); /*Scrolling ein*/ scroll(stdscr); init_pair(1,COLOR_YELLOW,COLOR_BLACK); /*Farbenpaar Nummer 1*/ init_pair(2,COLOR_CYAN,COLOR_CYAN); /*PaarNummer 2*/ init_pair(3,COLOR_GREEN,COLOR_BLACK); /*Farbenpaar Nummer 3*/ init_pair(4,COLOR_BLACK,COLOR_GREEN); /*Farbenpaar Nummer 4*/ while(c!=QUIT) { scrl(1); /*Eine Zeile runter scrollen*/ for(i=0;i<5;i++) { zufall=rand()%79; attrset(A_DIM|COLOR_PAIR(1)); /*Sterne dunkel ausgegeben*/ mvaddch(20,zufall,'*'); attrset(A_UNDERLINE|A_BOLD|COLOR_PAIR(4)); /*Blinkend*/ mvprintw(0,0,"'q' drücken für Quit | Taste für Start | " "<- nach links -> nach rechts"); } c=getch(); halfdelay(3); switch(c) { case LEFT : if(x<1) x=79; else x--; break; case RIGHT: if(x>79) x=1; else x++; break; default : break; } mvdelch(9,x+2);mvdelch(9,x+1);mvdelch(9,x); mvdelch(9,x-1);mvdelch(9,x-2); attrset(A_BOLD|COLOR_PAIR(2)); /*Raumschiff fette Schrift*/ mvaddch(10,x-1,ACS_LLCORNER); mvaddch(10,x+1,ACS_LRCORNER); attrset(A_BOLD|COLOR_PAIR(3)); mvaddch(10,x,ACS_TTEE); } /*Ende while()*/ endwin(); return 0; }




So siehts aus :



ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf