Problem jest taki - udało mi się zrobić na podstawie jakichś przykładów przykładowe menu, i tu jest wszystko ok. ale pytanie jest takie - >
jak np po wybraniu "Wybor 1" i wciśnięciu entera sprawić, aby wykonała się jakaś akcja, np wyświetlenie napisu?
#include <curses.h>
#define SZEROKOSC 30
#define WYSOKOSC 10
#define ENTER 10
char *opcje_menu[] = {
"wybor 1",
"wybor 2",
"wybor 3",
"wybor 4",
"wyjscie",
};
int ilosc_opcji = sizeof(opcje_menu) / sizeof(char *); // Wylicza ilosc elementu tablicy opcje_menu
int main()
{ WINDOW *okno; // Tworzy nowe okno
int podswietlenie = 1;
int wybor = 0;
int c, ilosc_kolumn, ilosc_rzedow, startx, starty;
initscr(); // Inicjalizacja trybu ncurses
clear(); // Wyczysc ekran
noecho(); // Nie wyswietlaj znaku
getmaxyx(stdscr, ilosc_rzedow, ilosc_kolumn); // Pobierz wymiary konsoli
startx = (ilosc_kolumn - SZEROKOSC) / 2; // Ustala lewy gorny rog okna
starty = (ilosc_rzedow - WYSOKOSC) / 2;
okno = newwin(WYSOKOSC, SZEROKOSC, starty, startx); // Tworzy nowe okno - wymiary WYSOKOSCxSZEROKOSC, lewy gorny rog w punkcie (startx, starty)
keypad(okno, TRUE); // Wlacza obsluge strzalek dla konsoli
mvprintw(0, 0, "Uzyj strzalek do poruszania sie w menu. Wcisnij Enter dla zatwierdzenia wyboru.");
refresh();
wyswietl_menu(okno, podswietlenie); // Wyswietla menu (sam tekst na poczatku)
while(1)
{ c = wgetch(okno); // Pobiera znak
switch(c)
{ case KEY_UP:
if(podswietlenie == 1)
podswietlenie = ilosc_opcji;
else
--podswietlenie;
break;
case KEY_DOWN:
if(podswietlenie == ilosc_opcji)
podswietlenie = 1;
else
++podswietlenie;
break;
case ENTER:
wybor = podswietlenie;
break;
refresh();
}
wyswietl_menu(okno, podswietlenie); // Wyswietla menu z aktualnym podswietleniem
if(wybor != 0) // Wyjscie z petli
break;
}
clear();
refresh();
endwin();
return 0;
}
void wyswietl_menu(WINDOW *okno, int podswietlenie)
{
int x, y, i;
x = 2;
y = 2;
box(okno, ACS_VLINE, ACS_HLINE); // Rysuje obramowanie: _ w poziomie | w pionie
start_color();
init_pair(1, COLOR_WHITE, COLOR_RED);
wbkgd(stdscr, COLOR_PAIR(1)); // Ustawia kolory dla ogolnego tla
wbkgd(okno, COLOR_PAIR(1)); // Dla tla w oknie
refresh();
for(i = 0; i < ilosc_opcji; ++i)
{ if(podswietlenie == i + 1)
{ wattron(okno, A_REVERSE); // Podswietla obecny wybor
mvwprintw(okno, y, x, "%s", opcje_menu[i]);
wattroff(okno, A_REVERSE); // Wylacza podswietlenie
}
else
mvwprintw(okno, y, x, "%s", opcje_menu[i]);
++y;
}
wrefresh(okno); // "Odswieza" okno
}