// -----------------------------------------------------------------------
// Datei : console.h
// Zweck : Prototypen und Konstante für Console.cpp 
// -----------------------------------------------------------------------
//  
// Deklaration der Funktionen cls(), setCursor(), setColor()
// für Windows 95, 98, 2000 und NT.
// Diese Funktionen sind in console.cpp definiert.
// 
// Außerdem einige Konstante für Farben
// -----------------------------------------------------------------------

#include <windows.h> 

// Konstante für Vordergrund- und Hintergrund-Farben
// Bereits definiert sind:
//   FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_BLUE, FOREGROUND_INTENSITY
//   BACKGROUND_RED, BACKGROUND_GREEN, BACKGROUND_BLUE, BACKGROUND_INTENSITY

// Und noch einige Kombinationen davon: 
#define BACKGROUND_CYAN   (BACKGROUND_GREEN | BACKGROUND_BLUE)
#define BACKGROUND_WHITE  (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE)
#define BACKGROUND_YELLOW (BACKGROUND_RED | BACKGROUND_GREEN)

#define FOREGROUND_CYAN   (FOREGROUND_GREEN | FOREGROUND_BLUE |  FOREGROUND_INTENSITY)
#define FOREGROUND_YELLOW (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define FOREGROUND_WHITE  (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)

static HANDLE hStdout; 
static CONSOLE_SCREEN_BUFFER_INFO csbInfo; 



// Prototypen der Funktionen

bool cls();
bool setCursor( int zeile, int spalte);
bool setColor( int color );

void cursorOff();
void cursorOn();

////////////////////////////////////////////////////////////////////////
// Funktion setCursor() : Cursor auf die angegebene Position setzen.

bool setCursor( int zeile, int spalte)
{
    COORD dwCursorPos = {spalte, zeile};

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    return SetConsoleCursorPosition(hStdout, dwCursorPos) != 0;
}
    
////////////////////////////////////////////////////////////////////////
// Funktion setColor() : Vorder- und Hintergrundfarbe setzen.

bool setColor( int color)
{
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    return SetConsoleTextAttribute(hStdout, (WORD)color) != 0;
}

////////////////////////////////////////////////////////////////////////
// Funktion cls() : Consolen-Puffer mit aktuellem Attribut löschen und 
//                  Cursor auf die Home-Position setzen.

bool cls()
{
    COORD home = { 0, 0 };          // Home-Position
    DWORD dwCellsWritten;           // Anzahl beschriebener Char-Zellen 
    DWORD dwConSize;                // Anzahl Zeichen im Puffer

    // Größe des Puffers und das aktuelle Attribut holen:
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdout, &csbInfo);
    
    dwConSize = csbInfo.dwSize.X * csbInfo.dwSize.Y;
 
    // Den Puffer mit Blanks füllen:
    if( ! FillConsoleOutputCharacter(hStdout, (TCHAR)' ', dwConSize,
                                     home, &dwCellsWritten) )
        return false;

    // Attribute setzen:
    if( ! FillConsoleOutputAttribute(hStdout, csbInfo.wAttributes, dwConSize,
                                     home, &dwCellsWritten) )
        return false;

    // Cursor auf Home-Position setzen 

    if( ! SetConsoleCursorPosition(hStdout, home) )
        return false;

    return true;
}

////////////////////////////////////////////////////////////////////////
// Funktion cursorOff() : Cursor unsichtbar machen.

void cursorOff()
{
    CONSOLE_CURSOR_INFO cursorInfo;   
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 

    GetConsoleCursorInfo( hStdout, &cursorInfo);
    cursorInfo.bVisible = FALSE;
    SetConsoleCursorInfo( hStdout, &cursorInfo);
}

////////////////////////////////////////////////////////////////////////
// Funktion cursorOn() : Cursor wieder sichtbar machen.

void cursorOn()
{
    CONSOLE_CURSOR_INFO cursorInfo;   
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 

    GetConsoleCursorInfo( hStdout, &cursorInfo);
    cursorInfo.bVisible = TRUE;
    SetConsoleCursorInfo( hStdout, &cursorInfo);
}

