Programowanie z ncurses (index)


Programowanie z ncurses (9) - różności

ZADANIE 9.1

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


/*
*  menu2dim.c
*
*  Program z HOWTO zmodyfikowany.
*  Przyklad okna z mozliwoscia poruszania kursorem i wprowadzania znakow.
*/

#include <ncurses.h>

/* Obliczenie rozmiaru okna stosownie do liczby pozycji w menu */
#define YLICZBA   9
#define XLICZBA   15
#define YSIZE   (YLICZBA+2) 
#define XSIZE   (2*XLICZBA+1)

void print_menu(WINDOW *win, int yrewers, int xrewers);

/* Globalna tablica do przechowywania etykiet */
char etykiety[YLICZBA][XLICZBA];

int main(void)
{
int i, j;
WINDOW *win;
int startx, starty;   /* polozenie okna menu */
int xmax, ymax;   /* rozmiary stdscr */
int yrewers= 1;    /* zakres od 1 do YLICZBA (nr etykiety w rewersie) */
int xrewers= 1;    /* zakres od 1 do XLICZBA (nr etykiety w rewersie) */
int ypozycja= 0;  /* zakres od 0 do YLICZBA (0 gdy nic nie wybrano) */
int xpozycja= 0;  /* zakres od 0 do XLICZBA (0 gdy nic nie wybrano) */
int c;

/* Inicjalizacja etykiet. */
for (i= 0; i < YLICZBA; ++i)
for (j= 0; j < XLICZBA; ++j)
	etykiety[i][j]= '.';
initscr();
clear();
noecho();
cbreak();
mvprintw(0, 0, "Uzyj kursora do poruszania. Nacisnij ENTER aby skonczyc.");
refresh();

getmaxyx(stdscr, ymax, xmax);
startx= (xmax - XSIZE) / 2;
starty= (ymax - YSIZE) / 2;
win= newwin(YSIZE, XSIZE, starty, startx);
keypad(win, TRUE);
print_menu(win, yrewers, xrewers);
while (ypozycja == 0 || xpozycja == 0) {
	c= wgetch(win);    /* troche magiczne obliczenia */
	if (c == KEY_UP) { 
		yrewers= (yrewers + YLICZBA -2) % YLICZBA + 1;
	} else if (c == KEY_DOWN) {
		yrewers= yrewers % YLICZBA + 1;
	} else if (c == KEY_LEFT) {
		xrewers= (xrewers + XLICZBA -2) % XLICZBA + 1;
	} else if (c == KEY_RIGHT) {
		xrewers= xrewers % XLICZBA + 1;
	} else if (c == '\n') {
		ypozycja= yrewers;
		xpozycja= xrewers;
	} else {
		etykiety[yrewers-1][xrewers-1]= c;
	}
	print_menu(win, yrewers, xrewers);
}	
mvprintw(ymax-2, 0, "Wybrano pozycje (y,x) = (%d,%d) \n", ypozycja, xpozycja);
refresh();
delwin(win);
endwin();
return 0;
}


void print_menu(WINDOW *win, int yrewers, int xrewers)
{
int x, y, i, j;

box(win, 0, 0);       /* ramka na okno */
for (i= 0; i < YLICZBA; ++i)
for (j= 0; j < XLICZBA; ++j) {
	y= 1+i;
	x= 1+2*j;
	if ((yrewers == i+1) && (xrewers == j+1)) {
	/* wyswietl te pozycje w rewersie */
		wattron(win, A_REVERSE); 
		mvwprintw(win, y, x, "%c", etykiety[i][j]);
		wattroff(win, A_REVERSE);
	} else {
		mvwprintw(win, y, x, "%c", etykiety[i][j]);
	}
}
wrefresh(win);
}

Skompilować i uruchomić program.


Programowanie z ncurses (index)