Programowanie z ncurses (index)


Programowanie z ncurses (7) - używanie menu

UŻYWANIE BIBLIOTEKI MENU

Aby użyć biblioteki menu, należy do kodu dołączyć nagłówki

#include <curses.h>
#include <menu.h>

Przy scalaniu trzeba dołączyć opcje -lcurses -lmenu.

FUNKCJE



ZADANIE 7.1

W katalogu domowym utworzyć podkatalog menu. Utworzyć w nim pliki Makefile i menu.c postaci:


/*
*  menu.c
*
*  Program z HOWTO zmodyfikowany.
*  Przyklad prostego menu.
*/

#include <ncurses.h>

#define XSIZE 35
#define YSIZE 10 

void print_menu(WINDOW *menu_win, int rewers);

char *etykiety[]= {                /* etykiety do menu */
    "Koniec pracy z bazą danych",
    "Pomoc i dodatkowe informacje",
    "Aktualizacja bazy danych",
    "Zapytania do bazy danych",
    "Pisemne raporty (LaTeX, HTML)"
};
/* Obliczenie liczby pozycji w menu */
int liczba= sizeof(etykiety) / sizeof(char *);

int main(void)
{
WINDOW *menu_win;
int startx= 0;   /* polozenie okna menu */
int starty= 0;   /* polozenie okna menu */
int xmax, ymax;   /* rozmiary stdscr */
int rewers= 0;    /* zakres od 0 do liczba-1 (nr etykiety w rewersie) */
int pozycja= -1;  /* zakres od -1 do liczba-1 (-1 gdy nic nie wybrano) */
int c;

initscr();
clear();
noecho();
cbreak();
getmaxyx(stdscr, ymax, xmax);
startx= (xmax - XSIZE) / 2;
starty= (ymax - YSIZE) / 2;
        
menu_win= newwin(YSIZE, XSIZE, starty, startx);
keypad(menu_win, TRUE);
mvprintw(0, 0, "Uzyj kursora do poruszania. Nacisnij ENTER aby wybrac pozycje.");
refresh();
print_menu(menu_win, rewers);
while (pozycja == -1) {
    c= wgetch(menu_win);
    if (c == KEY_UP) { 
        rewers= (rewers + liczba -1) % liczba;
    } else if (c == KEY_DOWN) {
        rewers= (rewers + 1) % liczba;
    } else if (c == '\n') {
        pozycja= rewers;
    } else {
        mvprintw(ymax-1, 0, "Nacisnieto znak = %3d drukowany jako '%c'", c, c);
        refresh();
    }
    print_menu(menu_win, rewers);
}    
mvprintw(ymax-2, 0, "Wybrano pozycje %d z etykieta %s\n", pozycja+1, etykiety[pozycja]);
clrtoeol();
refresh();
delwin(menu_win);
endwin();
return 0;
}


void print_menu(WINDOW *menu_win, int rewers)
{
int x, y, i;    

x= 2;
y= 2;
box(menu_win, 0, 0);       /* ramka na okno */
for (i= 0; i < liczba; ++i) {
    if (rewers == i) {  /* wyswietl te pozycje w rewersie */
        wattron(menu_win, A_REVERSE); 
        mvwprintw(menu_win, y, x, "%s", etykiety[i]);
        wattroff(menu_win, A_REVERSE);
    } else {
        mvwprintw(menu_win, y, x, "%s", etykiety[i]);
    }
    ++y;
}
wrefresh(menu_win);
}

Skompilować i uruchomić program.


Programowanie z ncurses (index)