Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Pietrzuch
Biblioteki C++

Proste Menu z użyciem biblioteki New Curses

[lekcja] Rozdział 7. Przykład wykorzystania biblioteki w praktyce - tworzenie własnego menu.

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:

C/C++
#include <ncurses.h>


int main()
{
    //start
    initscr();
    printw( "Przycisnij przycisk...\n" );
    noecho();
    //rozpoczynamy wyswietlanie menu!
    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
    {
        //pobieranie znaku
        znak = getch();
        clear();
        if( znak == 'a' && ktory != min_wybor )
        {
            ktory--;
        }
        else if( znak == 'z' && ktory != max_wybor )
        {
            ktory++;
        }
        //reakcja          
        if( znak == 10 )
        {
            switch( ktory )
            {
            case 1:
                mvprintw( 0, 0, "Opcja 1" );
                break;
            case 2:
                mvprintw( 0, 0, "Opcja 2" );
                break;
            }
        }
        //wyswietlanie
        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.

C/C++
#include <ncurses.h>


int main()
{
    //start
    initscr();
    printw( "Przycisnij przycisk...\n" );
    noecho();

Z tym nie powinno być problemów, po prostu początek programu i trzeba wszystko ładnie przygotować. ;)

C/C++
//rozpoczynamy wyswietlanie menu!
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ść.

C/C++
do
{
    //pobieranie znaku
    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.

C/C++
//reakcja          
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ć.

C/C++
//wyswietlanie
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:

C/C++
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. :)
Poprzedni dokument Następny dokument
Wyświetlanie tekstu w danej części ekranu Podsumowanie