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/