Utilizando a biblioteca NCURSES - Parte III

Neste etapa, vamos aprender a fazer um programinha utilizando menu. Vamos criar um programa com um menu acessado via teclado.

[ Hits: 49.687 ]

Por: Leonardo Barrozo dos Santos em 11/03/2003


Programa



{ menu.c }

#include <curses.h>
#include <stdlib.h>

//Constastes das teclas ENTER e ESCAPE.
#define ENTER 10
#define ESCAPE 27

void criarmenu(WINDOW *menubar)  //Função encarregada de criar um menu em nosso sistema
{
    wbkgd(menubar,COLOR_PAIR(2));    //Alterando a cor de fundo do menu
    waddstr(menubar,"Cadastros");    //Esta função escreve os nomes dos menus
    wattron(menubar,COLOR_PAIR(3));  //Alterando o par de cores para 3
    waddstr(menubar," F1 ");
    wattroff(menubar,COLOR_PAIR(3)); //Retornando para o par de cor 2.
    wmove(menubar,0,20);            // Posiciona o cursor na linha 0, coluna 20
    waddstr(menubar,"Relatórios");
    wattron(menubar,COLOR_PAIR(3));
    waddstr(menubar," F2 ");
    wattroff(menubar,COLOR_PAIR(3));
}

WINDOW **criaritensmenu(int coluna)  //Desenha os ítens do menu quando as teclas F1 ou F2 for pressionada
{
/*
  +--------------------------------------------------------------------------------------------+
  |   - Cria uma janela itensmenu[0] para desenhar uma caixa à volta do menu.                  |
  |   - Cria 8 ítens como sub-janelas da janela itensmenu[0].                                  |
  |   - Os 8 ítens são criados para poder mostrar o ítem selecionado no menu.                  |
  |   - Para um ítem de menu parecer selecionado basta tornar a sua cor de fundo diferente.    |
  +--------------------------------------------------------------------------------------------+
*/

    int i;
    WINDOW **itensmenu;
    itensmenu=(WINDOW **)malloc(9*sizeof(WINDOW *));

    itensmenu[0]=newwin(10,19,1,coluna);
    wbkgd(itensmenu[0],COLOR_PAIR(2));
    box(itensmenu[0],ACS_VLINE,ACS_HLINE);
    itensmenu[1]=subwin(itensmenu[0],1,17,2,coluna+1);
    itensmenu[2]=subwin(itensmenu[0],1,17,3,coluna+1);
    itensmenu[3]=subwin(itensmenu[0],1,17,4,coluna+1);
    itensmenu[4]=subwin(itensmenu[0],1,17,5,coluna+1);
    itensmenu[5]=subwin(itensmenu[0],1,17,6,coluna+1);
    itensmenu[6]=subwin(itensmenu[0],1,17,7,coluna+1);
    itensmenu[7]=subwin(itensmenu[0],1,17,8,coluna+1);
    itensmenu[8]=subwin(itensmenu[0],1,17,9,coluna+1);
    for (i=1;i<9;i++)
        wprintw(itensmenu[i],"Item%d",i);
    wbkgd(itensmenu[1],COLOR_PAIR(1));
    wrefresh(itensmenu[0]);
    return itensmenu;
}

void deletaritensmenu(WINDOW **itensmenu,int numeroitens) //Apaga os ítens da menu criado pela função acima
{
    int i;
    for (i=0;i<numeroitens;i++)
        delwin(itensmenu[i]);
    free(itensmenu);
}


int scrollmenu(WINDOW **itensmenu, int numeroitens, int colunainicial) //Permite fazer scroll entre e dentro dos menus
{
/*
  +--------------------------------------------------------------------------------------------+
  |- Lê as funções pressionadas com a função getch.                                            |
  |- Se as setas baixo ou cima são pressionadas então os ítens abaixo ou acima são seleciona- |
  |  dos tornando a cor do fundo do ítens diferente dos demais.                                |
  |- Se as setas direita ou esquerda são pressionadas então o menu aberto é fechado e o outro |
  |  é aberto.                                     |
  |- Se a tecla ENTER for pressionada, então o ítem selecionado é retornado.                   |
  |- Se a tecla ESC é pressionada, os menus são fechados.                                      |
  +--------------------------------------------------------------------------------------------+
*/

    int key;
    int selecionado=0;
    while (1)
    {
        key=getch();
        if (key==KEY_DOWN || key==KEY_UP)
        {
            wbkgd(itensmenu[selecionado+1],COLOR_PAIR(2));
            wnoutrefresh(itensmenu[selecionado+1]);
            if (key==KEY_DOWN)
            {
                selecionado=(selecionado+1) % numeroitens;
            } else
            {
                selecionado=(selecionado+numeroitens-1) % numeroitens;
            }
            wbkgd(itensmenu[selecionado+1],COLOR_PAIR(1));
            wnoutrefresh(itensmenu[selecionado+1]);
            doupdate();
        }
        else if (key==KEY_LEFT || key==KEY_RIGHT)
        {
            deletaritensmenu(itensmenu,numeroitens+1);
            touchwin(stdscr);
            refresh();
            itensmenu=criaritensmenu(20-colunainicial);
            return scrollmenu(itensmenu,8,20-colunainicial);
        }
        else if (key==ESCAPE)
        {
            return -1;
        }
        else if (key==ENTER)
        {
            return selecionado;
        }
    }
}

nt main()
{
/*
  +--------------------------------------------------------------------------------------------+
  |- Lê as funções pressionadas com a função getch.                                            |
  |- Se as teclas F1 ou F2 é pressionada, desenha a janela de menu correspondente com a função |
  |  criaritensmenu.                                                                           |
  |- Após isto chama a função scrollmenu e deixa o usuário fazer a seleção a partir dos menus. |
  |- Após o retorno da função scrollmenu apaga as janelas de menu e imprime o ítem selecionado |
  |  na barra de mensagem.                                 |
  |- Se a tecla ENTER for pressionada, então o ítem selecionado é retornado.                   |
  |- Se a tecla ESC é pressionada, os menus são fechados.                                      |
  +--------------------------------------------------------------------------------------------+
*/

    int key;
    int itemselecionado;
    WINDOW **itensmenu;
    WINDOW *menu,*mensagem;

    //Inicializações---------------------------------------------
    initscr();      //Inicializando a ncurses
    start_color();  //Tornando o uso das cores possíveis

    //Definição dos pares de cores
    init_pair(1,COLOR_GREEN,COLOR_BLACK);
    init_pair(2,COLOR_BLACK,COLOR_GREEN);
    init_pair(3,COLOR_RED,COLOR_GREEN);  
    
    curs_set(0);  //Faz com que o cursor físico fique invisível.
    noecho();     //Impede que as teclas apareçam na tela
    keypad(stdscr,TRUE);  //Ativa as teclas de função
    //-----------------------------------------------------------

    bkgd(COLOR_PAIR(1));
    menu=subwin(stdscr,1,80,0,0);
    mensagem=subwin(stdscr,1,79,23,1);
    criarmenu(menu);
    move(2,1);
    printw("F1  - Cadastros");
    move(3,1);
    printw("F2  - Relatórios");
    move(4,1);
    printw("ESC - Sair");
    refresh();

    do {
        key=getch();
        werase(mensagem);
        wrefresh(mensagem);
        if (key==KEY_F(1))
        {
            itensmenu=criaritensmenu(0);
            itemselecionado=scrollmenu(itensmenu,8,0);
            deletaritensmenu(itensmenu,9);
            if (itemselecionado<0)
                wprintw(mensagem,"Nenhum ítem foi selecionado.");
            else
                wprintw(mensagem,"Você selecionou o ítem %d.",itemselecionado+1);
            touchwin(stdscr);
            refresh();
        }
        else if (key==KEY_F(2))
        {
            itensmenu=criaritensmenu(20);
            itemselecionado=scrollmenu(itensmenu,8,20);
            deletaritensmenu(itensmenu,9);
            if (itemselecionado<0)
                wprintw(mensagem,"Nenhum ítem foi selecionado");
            else
                wprintw(mensagem,"Você selecionou o ítem %d.",itemselecionado+1);
            touchwin(stdscr);
            refresh();
        }
    } while (key!=ESCAPE);

    delwin(menu);
    delwin(mensagem);
    endwin();
    return 0;
}
Agora é só compilar:

gcc menu.c -o menu -lcurses

Baixar código-fonte: menu.c

Página anterior    

Páginas do artigo
   1. Novas funções
   2. Tabela das teclas de função
   3. Programa
Outros artigos deste autor

Introdução à linguagem C - Parte I

Introdução à linguagem C - Parte II

Utilizando a biblioteca NCURSES - Parte I

Utilizando a biblioteca NCURSES - Parte II

Leitura recomendada

Aprendendo a utilizar o GNU Debugger (parte 1)

LivreNFE - O emissor Nfe open source para Linux

Introdução à plataforma GNU de desenvolvimento

Detectando assalto na multidão com visão computacional

C - Include e Makefile

  
Comentários
[1] Comentário enviado por macb em 17/03/2004 - 20:58h

Achei muito legal este artigo.
E aproveitando, qual a funcao em C que executa um comando do shell?

[2] Comentário enviado por polegadas em 13/01/2005 - 19:13h

system(); que recebe como argumento o nome do comando como uma stirng.

[3] Comentário enviado por diegotosco em 19/10/2005 - 23:33h

Muito boa essa sua série de artigos, espero que essa saga continue, pois falta material na internet sobre bibliotecas diferentes das stdio, string, math...

Só mais uma coisa: que sites, apostilas, você indica para um iniciante como eu?

Muito obrigado

[4] Comentário enviado por diegotosco em 12/12/2005 - 01:18h

Para quem está começando como eu, eu fiz um pequeno programa para estudar os atributos do curses.h. Está todo comentado de uma forma bem didática e simples. Foi baseado nesses artigos do lbsantos e em outros disponíveis na web. Está disponível para visualização e download na seção de Scripts :: C/C++ :: Miscelânea.

[5] Comentário enviado por FireBird em 08/03/2006 - 16:26h

Cara..Denovo... executo o programa e ele roda.. cai an tela onde devo pressionar f1 ou f2... mas independente de qual eu pressione, ele sai do programa... o erro esta em meu compilador?

[6] Comentário enviado por josiel10 em 14/04/2006 - 16:42h

Muito boa essa série, mas me tira uma outra duvida, na ncurse tem as funções do turbo C, tais como line(), arc(), circle() ........

[7] Comentário enviado por okil em 14/05/2006 - 10:24h

Ho car ta muito bom este artigo vlw ai ate.............

[8] Comentário enviado por removido em 30/06/2006 - 01:32h

Muito bons esses artigos... parabens!!!
agora, soh uma pergunta, vc conhece alguma funcao em C q espera um determinado tempo??

Eu gostaria de fazer uma atualizacao depois de x segundos... sabe se tem como fazer isso??

abracos

[9] Comentário enviado por nikitah em 24/10/2006 - 15:03h

Fiz esse programa "Ola mundo" e rodou legal...agora o "Janelas"...
nao consegui, bem compilou mas as opções nao funciona...
ehhh...vou tentar de novo...mas ta muito joia...adorei seu artigo...
parabens....bjs

[10] Comentário enviado por albertguedes em 24/01/2008 - 19:52h

Muito bom o artigo Leonardo, principalmente pra quem esta começando, mas senti falta de uns links de referência.
Mas de resto, gostei.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts