Wstęp
Na tej lekcji postaramy się jakoś praktycznie wykorzystać umiejętności, które do tej pory poznaliśmy. Dzięki wyróżnianiu tekstu, uda nam się to w miarę ładnie i przejrzyście wykonać. W końcu ile można zamiast prawdziwego interaktywnego ;) menu, posługiwać się stylem odpowiedzi? ( Wybierz...1,2,3) Teraz już nie będzie można wybrać nie istniejącej odpowiedzi, a co więcej interfejs będzie o wiele przyjaźniejszy dla użytkownika programu. Oczywiście problem z menu można rozwiązać na wiele lepszych sposobów, ale pisząc ten kurs najważniejsze było dla mnie to, aby początkujący programista dał sobie z nim radę oraz mógł później tworzyć bardziej skomplikowane aplikacje bazując na własnej wiedzy.
Proste Menu - kod
A oto przykład jak wykonać takie menu, zaraz za kodem będzie odpowiednie wyjaśnianie:
#include <ncurses.h>
int main()
{
initscr();
printw( "Przycisnij przycisk...\n" );
noecho();
const char txt1[] = "Tekst";
const char txt2[] = "Tekst2";
const char txt3[] = "Wyjscie";
int ktory = 1;
int znak;
const short int min_wybor = 1;
const short int max_wybor = 3;
do
{
znak = getch();
clear();
if( znak == 'a' && ktory != min_wybor )
{
ktory--;
}
else if( znak == 'z' && ktory != max_wybor )
{
ktory++;
}
if( znak == 10 )
{
switch( ktory )
{
case 1:
mvprintw( 0, 0, "Opcja 1" );
break;
case 2:
mvprintw( 0, 0, "Opcja 2" );
break;
}
}
switch( ktory )
{
case 1:
mvprintw( 6, 5, txt2 );
mvprintw( 7, 5, txt3 );
attron( A_REVERSE );
mvprintw( 5, 5, txt1 );
break;
case 2:
mvprintw( 5, 5, txt1 );
mvprintw( 7, 5, txt3 );
attron( A_REVERSE );
mvprintw( 6, 5, txt2 );
break;
case 3:
mvprintw( 5, 5, txt1 );
mvprintw( 6, 5, txt2 );
attron( A_REVERSE );
mvprintw( 7, 5, txt3 );
break;
}
attroff( A_REVERSE );
} while( ktory != 3 || znak != 10 );
move( 9, 0 );
printw( "Koniec programu, przycisnij przycisk..." );
getch();
endwin();
}
Proste Menu - tłumaczenie kodu
To teraz wytłumaczę trochę innym sposobem, o co w tym całym programie chodzi.
#include <ncurses.h>
int main()
{
initscr();
printw( "Przycisnij przycisk...\n" );
noecho();
Z tym nie powinno być problemów, po prostu początek programu i trzeba wszystko ładnie przygotować. ;)
const char txt1[] = "Tekst";
const char txt2[] = "Tekst2";
const char txt3[] = "Wyjscie";
int ktory = 1;
int znak;
const short int min_wybor = 1;
const short int max_wybor = 3;
Zmienne oraz stałe, bez których ciężko jest stworzyć menu. Szczególnie przydatne są stałe min_wybor, max_wybor. Jeżeli chodzi o zmienne to bardzo trudno byłoby bez nich się obejść.
do
{
znak = getch();
clear();
if( znak == 'a' && ktory != min_wybor )
{
ktory--;
}
else if( znak == 'z' && ktory != max_wybor )
{
ktory++;
}
Początek pętli do{...}while. Tutaj za każdym jej obrotem pobieramy znak z klawiatury oraz odpowiednio zmieniamy wartości zmiennej 'ktory' po wciśnięciu przycisków a lub z. Tutaj znajduje się też funkcja, o której wcześniej nie mówiliśmy jest to
clear(). Czyści ona okno terminala, bardzo przydatna w programach konsolowych.
if( znak == 10 )
{
switch( ktory )
{
case 1:
mvprintw( 0, 0, "Opcja 1" );
break;
case 2:
mvprintw( 0, 0, "Opcja 2" );
break;
}
}
Tutaj reagujemy na wciśnięcie przycisku enter, odpowiednio do wartości zmiennej 'ktory'. My jedynie wyświetlamy tekst, jednak Ty możesz ten program rozbudować.
switch( ktory )
{
case 1:
mvprintw( 6, 5, txt2 );
mvprintw( 7, 5, txt3 );
attron( A_REVERSE );
mvprintw( 5, 5, txt1 );
break;
case 2:
mvprintw( 5, 5, txt1 );
mvprintw( 7, 5, txt3 );
attron( A_REVERSE );
mvprintw( 6, 5, txt2 );
break;
case 3:
mvprintw( 5, 5, txt1 );
mvprintw( 6, 5, txt2 );
attron( A_REVERSE );
mvprintw( 7, 5, txt3 );
break;
}
attroff( A_REVERSE );
} while( ktory != 3 || znak != 10 );
Na początku jest wyświetlany tekst w zależności od wartości zmiennej 'ktory', czyli od tego na które pole najechaliśmy. Wszystkie teksty są wyświetlane normalnie z wyjątkiem jednego, zaznaczonego przez użytkownika który jest wyswietlany na końcu w trybie
A_REVERSE (kontrastowym). Później znajduje się przywrócenie normalnego trybu wyświetlania. Na końcu jest zakończenie pętli do...while która cały czas powtarza póki zmienna ktory nie jest równa 3 (przycisk Wyjscie) lub nie jest wciśnięty Enter. Po prostu powtarza dopóki nie nakierujemy na przycisk Wyjscie i nie wciśniemy Enter.
A teraz ostatni, chyba nakrótszy fragment kodu:
move( 9, 0 );
printw( "Koniec programu, przycisnij przycisk..." );
getch();
endwin();
}
To jest zwyczajny koniec prgramu. Jeśli chcesz, aby twój program coś jeszcze później wyświetlał musisz to napisać tak, jak ja to zrobiłem przed ostatnią funkcją endwin().
Zakończenie
Mam nadzieję, że teraz już wiesz jak zrobić swoje pierwsze 'klawiaturowe' menu, a lekcje zamieszczone tutaj przydały Ci się do nauki. ;) Starałem się ten kurs dostosować do osób rozpoczynających swoją przygodę w C++ i mam nadzieję, że mi się to udało.
Cóż to już ostatnia lekcja, teraz zostało już tylko podsumowanie, które powinno utrwalić twoją wiedzę zdobytą tutaj. :)