Menu w ncurses

0

Witam,

Stworzyłem takie menu do mojego programu:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#include "wszystkie.h"
#define ROZM 50


int main()
{

    int t=1,n;
    initscr();
    mvprintw( 5,10, "Witaj w spis plyt CD/DVD. Prosze o wcisniecie dowolnego klawisza \n" );
    noecho();

    const char txt1[] = "Dodaj nowy rekord";
    const char txt2[] = "Wyswietl baze";
    const char txt3[] = "Zapisz baze do pliku";
    const char txt4[] = "Wczytaj baze z pliku";
    const char txt5[] = "Szukaj rekordu w bazie";
    const char txt6[] = "Edytuj rekord";
    const char txt7[] = "Usuń rekord";
    const char txt8[] = "Wyjscie";
    int ktory = 1;
    int znak;
    const int min_wybor = 1;
    const int max_wybor = 8;
    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:
                //dodaj();
                printw("dupa");
                break;
            case 2:
                mvprintw( 0, 0, "Opcja 2" );
                break;
            }
        }*/
        //wyswietlanie
        switch( ktory )
        {
        case 1:
            mvprintw( 6, 5, txt2 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 11, 5, txt7 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 5, 5, txt1 );
            break;

        case 2:
            mvprintw( 5, 5, txt1 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 11, 5, txt7 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 6, 5, txt2 );
            break;

        case 3:
            mvprintw( 5, 5, txt1 );
            mvprintw( 6, 5, txt2 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 11, 5, txt7 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 7, 5, txt3 );
            break;
        case 4:
            mvprintw( 5, 5, txt1 );
            mvprintw( 6, 5, txt2 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 11, 5, txt7 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 8, 5, txt4 );
            break;
        case 5:
            mvprintw( 5, 5, txt1 );
            mvprintw( 6, 5, txt2 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 11, 5, txt7 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 9, 5, txt5 );
            break;
        case 6:
            mvprintw( 5, 5, txt1 );
            mvprintw( 6, 5, txt2 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 11, 5, txt7 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 10, 5, txt6 );
            break;
        case 7:
            mvprintw( 5, 5, txt1 );
            mvprintw( 6, 5, txt2 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 12, 5, txt8 );
            attron( A_REVERSE );
            mvprintw( 11, 5, txt7 );
            break;
        case 8:
            mvprintw( 5, 5, txt1 );
            mvprintw( 6, 5, txt2 );
            mvprintw( 7, 5, txt3 );
            mvprintw( 8, 5, txt4 );
            mvprintw( 9, 5, txt5 );
            mvprintw( 10, 5, txt6 );
            mvprintw( 11, 5, txt7 );
            attron( A_REVERSE );
            mvprintw( 12, 5, txt8 );
            break;
        }
        attroff( A_REVERSE );
    } while( ktory != 3 || znak != 10 );

    move( 9, 0 );
    printw( "Koniec programu, przycisnij przycisk..." );
    getch();
    endwin();

I teraz chodzi mi o to zebym mógł "wchodzić" do poszczególnych pozycji za pomocą wciśnięcia ENTER'a. Kompletnie nie wiem jak się do tego zabrać.

0

masz tam nawet komentarz z kodem, który mniej więcej robiłby to o co potrzebujesz. Dodaj "else if" z warunkiem czy pobrany znak nie jest enterem (KEY_ENTER) i wpakuj do tego ten switch z menu.

1

const char txt1[] = "Dodaj nowy rekord";
const char txt2[] = "Wyswietl baze";
const char txt3[] = "Zapisz baze do pliku";
const char txt4[] = "Wczytaj baze z pliku";
const char txt5[] = "Szukaj rekordu w bazie";
const char txt6[] = "Edytuj rekord";
const char txt7[] = "Usuń rekord";
const char txt8[] = "Wyjscie";

Za każdym razem, gdy powstaje kod w którym powtarzasz take same lub podobne linijki – powinieneś się zatrzymać i zastanowić, co robisz niewłaściwie.

const char* txt[] = {
    "Dodaj nowy rekord",
    "Wyswietl baze",
    "Zapisz baze do pliku",
    "Wczytaj baze z pliku",
    "Szukaj rekordu w bazie",
    "Edytuj rekord",
    "Usuń rekord",
    "Wyjscie"
};
0

Czyli mówisz ze powinienem zrobić to następująco:

       if( znak == 10 )
        {
            switch( ktory )
            {
            case 1:
                //dodaj();
                printw("dupa");
                break;
            case 2:
                mvprintw( 0, 0, "Opcja 2" );
                break;
            }
        }
        else if (znak==KEY_ENTER )
        {
            switch(ktory)
            {
            case 1:
            dodaj();
            break;
            }
        }
0

Coś w tym stylu. Ale tak na serio - posłuchaj rady @Azarien bo dobrze prawi - ta poprawka sugerowana przez niego to idealny wstęp do poprawienia tego molocha z wyświetlaniem. Ten kod można pięknie napisać z użyciem dodatkowej funkcji i bez switcha w max 9 linijek.

0

No to weś powiedz o jakiej funkcji myślisz. Program do tej pory był zrobiony bez NCURSES, a teraz mam polecenie napisać go z wykorzystaniem tej biblioteki. Robię to pierwszy raz więc za molochy przepraszam

0

Dobra, nie będę się znęcał, rozumiem że praca domowa w liceum. Przykład funkcji, zakładając że użyjesz wskazówki @Azarien :

 
void disp(int ktory){
int pos=ktory-1;
 for(int i=0; i<8;++i){
  if(i==pos) continue;
  mvprintw( 5+i, 5, txt[i] );
 }
 attron( A_REVERSE );
 mvprintw( 5+pos, 5, txt[pos] );
 attroff( A_REVERSE );
}

10 linijek, masz wszystko co potrzeba. Zadanie dla Ciebie: wstaw sobie odwołanie do tego zamiast switcha. A, i nie gwarantuje poprawności kodu, ale zakładam że jest ok.

0

opakuj to w glowna petle while(char=getc()!=ENTER) { ...wyswietlanie aktualnej pozycji w menu... } sry ze w pseudokodzie ale to powinno wystarczyc.
peace
ChS

0

Znalazłem :)

while(w = getch()){
s_menu('L', wi);
if(w!='q' && w!=10){ // 10 zmien jako ENTER i niech preprocesor Ci wybiera co masz za OS i jaki enter ma numer w ascii
    switch(w){// zmienna wi to aktualna pozycja
        case 0x104:
        wi--;
        w=getch();
        break;
        case 0x105:
        wi++;
        w=getch();
        break;
    }
}else{
;//inne operacje
}
tolower(w);
  }

korzystaj i modyfikuj do woli ;)
peace
ChS

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