ncurses.h, menu - akcja po wyborze

0

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
}
 
0

w main przed clear (zakładam, że clear czyści obraz, a jak wyświetlasz okienko z błędem to nie chcesz kończyć menu.)

switch( wybor ){
case 1: MessageBox( 0, "Wybrałeś wybór1!" "Wybrałeś...", MB_ICONEXCLAMATION); break; 
case 2: MessageBox( 0, "Wybrałeś wybór2!" "Wybrałeś...", MB_ICONEXCLAMATION); break;
}

rozważ też zamiast while(1) danie while( bInMenu ). Wtedy możesz zrobić:

bInMenu = MenuAction( wybor );

Powyższy switch leci do funkcji MenuAction ofc :)

zamiast:

if(wybor != 0)        // Wyjscie z petli
                        break;
0

hmm dobra, to już działa : )
tyle, że wciąż zostaje na środku okno z tym menu, to muszę jakąś komendę znaleźć

0

nadal mi coś nie wychodzi...
dodałem taki kod

 	switch(wybor){
case 1: clear();werase(okno);
for(i=0;i<80;i++)
    for(j=0;j<25;j++)
    mvprintw(j, i,"x");
			break;
			}

i teoretycznie po wyborze opcji pierwszej (i zatwierdzeniu enterem) powinno wypełnić cały terminal x-ami, ale w miejscu w którym było okno wyboru tego nie robi. jak rozumiem funkcja werase kasuje zawartość okno, ale nie samo okno. Z kolei funkcja delwin() powoduje mi wywalenie programu
screen problemu: http://zapodaj.net/71a0cb109e9fe.jpg.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1