Tuesday, April 24, 2018

GUI w terminalu i ncurses - PL



Piszesz programy z użyciem cin/cout? Chciał(a)byś dodać do programów interfejs użytkownika w konsoli? Ten artykuł jest dla Ciebie, opiszę w nim najważniejsze i najbardziej podstawowe wiadomości nt biblioteki ncurses.
Na tą chwilę najnowsza wersja biblioteki nosi numer 6.1 i została wydana 27. stycznia 2018 r.

Aby rozpocząć zabawę z GUI w terminalu należy dołączyć plik nagłówkowy

ncurses.h do swojego programu. Dodatkowo, program kompilujemy z użyciem flagi: -lcurses (gcc/g++).

Podstawową strukturą używaną w programie będzie WINDOW i wskaźnik na obiekt te struktury będzie przekazywany do funkcji biblioteki ncurses.


Pierwszy program z ncurses

Nasz pierwszy przykładowy program jest bardzo prosty (uwaga, ten i kolejne przykłady zaczerpnięte będą m.in. z [1] - nie jestem specjalistą od ncurses, sam uczę się pisząc ten mini tekst, dlatego mam nadzieję takie zapoiżyczenie jest w porządku):

-------------------------------------------
#inlcude <ncurses.h>

int main()
{
   initscr();                      // inicjalizuj okno
   printw("Hi\n");             // wypisz napis "Hi"
   refresh();                     // umieść całość w konsoli
   getch();                        // poczekaj na klawisz z klawiatury
   endwin();                     // wyjdź
   return 0;
}
-------------------------------------------

Program otwiera nowe okno (to nie jest faktycznie okno GUI, ale wirtualny ekran w konsoli), wyświetla tam napis (printw), następnie ten wirtualny ekran jest pokazywany (refresh), a po naciśnięciu klawisza (getch()) zamyka otwarty ekran i powraca do widoku konsoli sprzed otwarcia okna. Brzmi skomplikowanie, ale jest w sumie proste, efekt działania poniżej na obrazku.

Pierwszy, najprostrzy program w C++.

Obsługa klawiszy - program drugi

Zajmiemy się teraz podstawową obsługą klawiszy. To będze przykład, który wyświetla znaki z klawiatury, ale tak aby były pogrubione, lub "F1", jeśli ktoś wcisnął F1. W komentarzach umieszczam minimum informacji, aby zrozumieć przykład:

-------------------------------------------
#include <ncurses.h>

int main()
{
    int ch;       // wartość wciśniętego klawisza
    initscr();
    raw();        // "return" nie jest już potrzebny

    keypad(stdscr, TRUE);  
                    // można odczytywać
                    // "nieznakowe" klawisze,
                    // strzałki, etc.

    noecho();  // nie wypisuj wciśniętych klawiszy

     printw("Napisz dowolny znak\n");   
                   // komunikat, "w" dlatego, że piszemy
                   // na ekranie wirtualnym
    ch = getch();  // nie trzeba "return", bo było wywołane
                          // "raw"
    if(ch == KEY_F(1))   // F1?
        printw("Wcisnales F1");
    else    {    printw("Wcisnales: ");
        attron(A_BOLD);  // pogrubienie
        printw("%c", ch); // wypisz co wcisnął użytkownik
        attroff(A_BOLD);
    }
    refresh();            // przerzuć na główny ekran w konsoli
        getch();          // czekaj na naciśnięcie klawisza
    endwin();           // koniec trybu "ncourses"

    return 0;
}
-------------------------------------------

To tyle na pierwszy raz, jeśli będzie zainteresowanie tym postem rozwinę opis ncurses dalej, zachęcam przede wszystkim do zapoznania z [1], [2] oraz [3].




Źródła:
1. http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
2. http://www.linuxfocus.org/English/March2002/article233.shtml#233lfindex1
3. https://www.viget.com/articles/game-programming-in-c-with-the-ncurses-library/



Soda Constructor (Revisited)