Conhecendo atributos do Ncurses

Publicado por Diego da Silva de Medeiros 12/12/2005

[ Hits: 9.238 ]

Homepage: www.sj.cefetsc.edu.br/~dsmedeiros

Download Ncurses.c




Um programa para conhecer alguns atributos do curses.h.
Eu já tinha feito algumas partes separadamente, então juntei tudo num único programa, que ao meu ver, ficou bem legal. Está todo comentado de uma forma bem didática. A lógica utilizada é baseada nos artigos disponíveis na web (inclusive aqui no VOL), mas possui algumas diferenças que facilitaram a compreensão.

RECOMENDO, CASO HAJAM DÚVIDAS QUANTO ÀS FUNÇÕES UTILIZADAS, A CONSULTA NO man,  EM ESPECIAL: $man ncurses

  



Esconder código-fonte

//___________________________________________________________
//   RECOMENDO O DOWNLOAD DO SCRIPT PARA A VISUALIZAÇÃO
// EM UM EDITOR COLORIDO E COM AS DEVIDAS ENDENTAÇÕES,
// ISSO FACILITA O ENTENDIMENTO. 
//___________________________________________________________

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*                             PROGRAMA PARA TESTAR ALGUNS ATRIBUTOS DEFINIDOS NO curses.h                                     */
/*                                                                                                                             */
/*    Autor: Diego da Silva de Medeiros  -  d-medeiros@hotmail.com  -   Baseado em artigos e tutoriais espalhados pela web     */
/*                                                                                                                             */
/*   Recomendo a série de artigos do Leonardo B. dos Santos daqui do VOL, em artigos/ C/C++/ Miscelânea, realmente muito bons  */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

//Observação: Esse tipo de comentário (após duas barras), não está definido no C padrão ANSI, podendo, dependendo do compilador, não ser compilado com sucesso. Caso ocorra algum problema desse tipo, use o comentário padrão (texto entre o /* e o */)

//Dica: Caso não consiga enteder a lógica aqui empregada, comece dando uma olhada geral nas funções, após isso, imagine-se um processador, começando pela função main() e seguindo todos os comandos e funções do programa

#include <stdio.h>
#include <curses.h>
#include <stdlib.h> //para usar a função exit()

#define ENTER 10    //valores diretos da tabela ASCII, tecla ENTER = 10
#define ESCAPE 27   //tecla ESC = 27

#define FUNDO    1
#define COR_MENU 2  //definindo nomes para o código ficar mais claro
#define CURSOR   3


void criar_barra_ferramentas(WINDOW *barra_ferramentas);    //função que criará a barra de ferramentas
WINDOW **abrir_submenu(int numero_itens, int coluna);    //função que criará o submenu
int cursor(WINDOW **itens_menu, int numero_itens);     //função que cuidará do cursor e do item selecionado
void remover_submenu(WINDOW **itens_menu, int numero_itens);     //função que deletará cada janela e liberará memória alocada
void imprimir_cores(int item_selecionado);         //função que imprimirá o teste de cores
void imprimir_janela(int item_selecionado);      //função que imprimirá o teste de janela
void f1();             //função que organizará todas as variáveis e funções, caso a tecla pressionada tenha sido o F1
void f2();         //idem à função anterior, porém, quando a tecla F2 for pressionada



//=============================================================================================
int main()
{
  int key;       //variável que receberá a tecla pressionada
  WINDOW *barra_ferramentas;         //ponteiro WINDOW que será a referência para a barra de ferramentas

  initscr();  //inicializar o curses
  start_color();   //possibilita o uso das cores

  //definição de pares de cores para a interface
  init_pair(FUNDO,    COLOR_CYAN,   COLOR_BLACK);
  init_pair(COR_MENU, COLOR_BLUE,   COLOR_YELLOW);
  init_pair(CURSOR,   COLOR_YELLOW, COLOR_BLUE);
  init_pair(4,        COLOR_BLACK,  COLOR_YELLOW);
  init_pair(11,       COLOR_YELLOW, COLOR_BLACK);
  init_pair(12,       COLOR_RED,    COLOR_BLACK);

  curs_set(0);  //faz com que o cursor fique invisível (0) ou apareça (1)
  noecho();  //impede que as teclas digitads apareçam na tela
  keypad(stdscr, TRUE); //abilita o uso dos #defines do teclado, possibilita, por exemplo a referência da tecla F1 por KEY_F1

  //--------------------------------------------------------------------------------------------

  bkgd (COLOR_PAIR(FUNDO));   //definindo o fundo do ecrã

  mvprintw(14,2,"Características do curses.h");
  mvprintw(18,2,"-> F1  -  Teste de Cores.");   //move o cursor para a linha 18, coluna 2 e imprime
  mvprintw(19,7,"(w)attron() para inserí-los no curses.");
  mvprintw(22,2,"-> F2  -  Teste de Janela.");
  mvprintw(23,7,"box() para inserí-los no curses.");
  mvprintw(26,2,"-> ESC -  Sair");
  attron(COLOR_PAIR(12));      //ligando attr(on) um atributo (COLOR_PAIR(12))
  mvprintw(36,2,"Consulte o man, quando aparecerem as dúvidas!");
  attroff(COLOR_PAIR(12));     //desligando o mesmo atributo
  refresh();    //atualiza a tela

  criar_barra_ferramentas(barra_ferramentas);      //aqui, criarei a barra de ferramentas, aquela pequena aba superior

  do
    {
      key = getch();     //vai esperar o usuário digitar uma tecla
      mvprintw(30, 2, "                                           ");  //vai apagar (de uma forma tosca) o que estiver escrito na linha 30, coluna 2, que é o quadro de mensagem - execute o programa, tecle F1 e tecle ESC, irá aparecer uma mensagem em amarelo

      if (key == KEY_F(1))  //se a tecla pressionada for o F1
   f1();      //chama a função f1()

      else if (key == KEY_F(2))   //senão, se for o F2
   f2();                  //chama a função f2()
   
    }while(key != ESCAPE);   //pede ao usuário que digite uma tecla até que a tecla pressionada seja ESCAPE
  

  delwin(barra_ferramentas);     //deleta a barra de ferramentas
  endwin();                  //termina a curses
  exit(0);         //finaliza o programa em estado normal (0)
}

//===============================================================================================

void criar_barra_ferramentas(WINDOW *barra_ferramentas)
{
  barra_ferramentas = subwin(stdscr,1,100,0,0);   //o ponteiro barra_ferramentas apontará para uma subwin que aparecerá na janela principal (stdscr), com 1 linha e 100 colunas, que aparecerá na linha 0, coluna 0
  wbkgd (barra_ferramentas, COLOR_PAIR(COR_MENU));  //mudando o fundo da subjanela barra de ferramentas, usando o #define COR_MENU

  waddstr(barra_ferramentas,"Teste de Cores - F1");  //waddstr: Window ADD STRing, adiciona a string na janela, onde o cursor estiver
  wmove(barra_ferramentas,0,30);         //move o cursor da subwin barra_ferramentas para a linha 0, coluna 30
  waddstr(barra_ferramentas,"Teste de Janela - F2");
  wrefresh(barra_ferramentas);          //atualiza a subwin
}

//===============================================================================================

WINDOW **abrir_submenu(int numero_itens, int coluna)
{
  int i;  //o famoso i do for()

  WINDOW **itens_menu;   //variável que armazenará todas as janelas

  itens_menu = (WINDOW **) malloc(numero_itens * sizeof(WINDOW **));   //usando alocação dinâmica para criar um vetor de janelas (por incrível que pareça, assim fica mais fácil)

  itens_menu[0] = newwin((numero_itens + 2), 25, 1, coluna);   //aqui, toda a janela com os itens será criada, com duas linhas a mais que o número de itens, para ter espaço para a moldura
  wbkgd(itens_menu[0], COLOR_PAIR(COR_MENU));   //mudando o fundo da janela
  box(itens_menu[0], ACS_VLINE, ACS_HLINE);    //criando uma moldura na janela

  for (i = 1; i <= numero_itens; i++)
    {
      itens_menu[i] = subwin(itens_menu[0], 1, 23, (i + 1), (coluna + 1));    //cada ponteiro  do vetor itens_menu aponta para uma subjanela que aparecerá na janela itens_menu[0], com 1 linha e 23 colunas (2 a menos que a coluna do menu, lembre-se da moldura), que aparecerá na linha i+1 (da janela padrão stdscr), e na coluna (coluna + 1) (a mesma coluna do quadro do menu, menos 1 da moldura)
      wbkgd(itens_menu[i], COLOR_PAIR(COR_MENU));     //mudando o fundo de cada subwin
    }
  if (coluna == 0)  //aqui eu testo a coluna, se ela for 0, quer dizer que a tecla pressionada foi o F1, senão, foi o F2
    {
      waddstr(itens_menu[1], " 1.  Cores Normais");
      waddstr(itens_menu[2], " 2.  A_BOLD");
      waddstr(itens_menu[3], " 3.  A_UNDERLINE");
      waddstr(itens_menu[4], " 4.  A_REVERSE");
      waddstr(itens_menu[5], " 5.  A_BLINK");          //estou imprimindo os textos de cada opção dos menus
      waddstr(itens_menu[6], " 6.  A_STANDOUT");
      waddstr(itens_menu[7], " 7.  A_ALTCHARSET");
      waddstr(itens_menu[8], " 8.  A_ATTRIBUTES");
    }
  else
    {
      waddstr(itens_menu[1], " 1.  Corners");
      waddstr(itens_menu[2], " 2.  Tees");
      waddstr(itens_menu[3], " 3.  Lines");
      waddstr(itens_menu[4], " 4.  Plus & Diamonds");
      waddstr(itens_menu[5], " 5.  Scans");
      waddstr(itens_menu[6], " 6.  Ckboards & Degrees");
      waddstr(itens_menu[7], " 7.  Plminus & Bullets");
      waddstr(itens_menu[8], " 8.  Arrows");     
      waddstr(itens_menu[9], " 9.  Boards & Lanterns");
      waddstr(itens_menu[10], " 10. Blocks & PIs ");
      waddstr(itens_menu[11], " 11. Equals");
      waddstr(itens_menu[12], " 12. Strlings");
    }
  
  wbkgd(itens_menu[1], COLOR_PAIR(CURSOR));    //já coloquei o cursor na primeira subjanela, a primeira opção
  wrefresh(itens_menu[0]);        //atualiza a janela itens_menu[0]
  return itens_menu;        //retorna o vetor de ponteiro para ponteiro itens_menu
}

//================================================================================================

int cursor(WINDOW **itens_menu, int numero_itens)
{
  //- - - - - - 
  // cada opção é uma subjanela, que, quando escolhida, será realçada pela mudança de seu background
  //- - - - - -


  int key;
  int item_selecionado = 1;      //variável que guardará o número do item selecionado, ela é iniciada com 1 porque o cursor começa na primeira opção

  do
    {
      key = getch();      //espera o usuário digitar uma tecla

      if (key == KEY_DOWN || key == KEY_UP)       //se foi seta para baixo ou seta para cima
   {
     wbkgd(itens_menu[item_selecionado], COLOR_PAIR(COR_MENU));   //muda o fundo da opção que estava anteriormente selecionada, voltando ao fundo padrão
     wrefresh(itens_menu[item_selecionado]);        //atualiza a subjanela para aplicar as mudanças
     
     if (key == KEY_DOWN)        //se a tecla foi seta para baixo...
       {
         if (item_selecionado == numero_itens)    //...e se o cursor já estiver na última opção do menu...
      item_selecionado = 1;      //...volta o cursor para a primeira posição.
         else            //senão
      item_selecionado = (item_selecionado + 1);   //apenas incrementa o cursor. *** EU ACHEI ESSA MANEIRA MAIS FÁCIL DE ENTENDER E LIVRE DE ERROS 
                                                                                        // DO QUE A MANEIRA MATEMÁTICA PRESENTE EM QUASE TODOS OS ARTIGOS ***
       }
     
     else if (key == KEY_UP)    //se a tecla foi seta para cima...
       {
         if (item_selecionado == 1)      //...e se o cursor já estiver na primeira posição...
      item_selecionado = numero_itens;    //...o cursor é movida para a última posição da lista.
         else
      item_selecionado = (item_selecionado - 1);    //senão apenas decrementa o cursor
       }

     wbkgd(itens_menu[item_selecionado], COLOR_PAIR(CURSOR));    //muda o fundo da opção selecionada para deixá-la visível
     wrefresh(itens_menu[item_selecionado]);        //e atualiza a tela para aplicar as alterações
   }

      else if (key == KEY_LEFT || key == KEY_RIGHT)      //se atecla digitada foi seta para a esquerda ou seta para a direita, que mudará o menu corrente
   {
     remover_submenu(itens_menu, numero_itens);   //remove o menu corrente
     touchwin(stdscr);         //reescreve toda a tela, com base nos flags registrados
     refresh();       //esse refresh é necessário para parar o touchwin()

     if (numero_itens == 8)     //se o número de itens for 8, quer dizer que o menu atual é o referente ao F1
       f2();            //chama a função F2, e recomeça toda a lógica até aqui vista
     else
       f1();       //senão, quer dizer que o menu atual é o F2, então chama a função F1

     return 0;   //fecha a função cursor
   }

      else if (key == KEY_F(1) || key == KEY_F(2))  //senão, se a tecla digitada foi F1 ou F2
   {
     if (key == KEY_F(1))     //se a tecla foi F1
       {
         remover_submenu(itens_menu, numero_itens);  //remove o menu atual
         touchwin(stdscr);  //redesenha a tela
         refresh();      //atualiza
         f1();      //e chama a função F1
         return 0;
       }
     else if (key == KEY_F(2))
       {
         remover_submenu(itens_menu, numero_itens);    //mesma coisa da anterior
         touchwin(stdscr);
         refresh();
         f2();
         return 0;
       }
   }
      
      else if (key == ENTER)     //se a tecla foi enter
   {
     attron(COLOR_PAIR(11));      //muda o par de cor
     mvprintw(30, 2,"Você selecionou o item %i", item_selecionado);    //diz qual foi o item selecionado
     refresh();                //atualiza
     attroff(COLOR_PAIR(11));     //volta para o par de cor anterior
     return item_selecionado;        //retorna o número do item selecionado
   }
      
    } while (key != ESCAPE);       //espera o usuário digital algo até ele digitar ESC para abortar e fechar o menu

  attron(COLOR_PAIR(11));          //mesma forma acima colocada
  mvprintw(30, 2,"Você não selecionou nenhum item");
  refresh();
  attroff(COLOR_PAIR(11));
  return 0;
  
}


//=============================================================================================


void remover_submenu(WINDOW **itens_menu, int numero_itens)       //função encarregada de remover e liberar a memória alocada dinamicamente
{
  int i;

  for (i = 0; i <= numero_itens; i++)
    delwin(itens_menu[i]);   //deleta cada janela indexada por i

  free(itens_menu);   //libera toda área de memória apontada por itens_menu
}

//============================================================================================

void imprimir_cores(int item_selecionado)        //função que mostrará o conteúdo de cada opção referente ao teste de cores (F1)
{
  //definindo pares de cores para o menu Teste de Cores
  init_pair(5, COLOR_BLUE,  COLOR_RED);
  init_pair(6, COLOR_GREEN, COLOR_YELLOW);
  init_pair(7, COLOR_BLACK, COLOR_CYAN);
  init_pair(8, COLOR_WHITE, COLOR_MAGENTA);
  init_pair(9, COLOR_WHITE, COLOR_BLUE);

  WINDOW *janela;     //ponteiro que apontará para a janela que irá se abrir ao escolher uma opção

  janela = newwin(15, 40, 20, 60);      //o ponteiro janela apontará para uma newwin de dimensões 15x40, que aparecerá na linha 20, coluna 60
  wbkgd(janela, COLOR_PAIR(9));       //colocando um fundo nessa janela
  box(janela, ACS_VLINE, ACS_HLINE);     //colocando uma moldura
  wrefresh(janela);            //atualizando a janela

  if (item_selecionado == 1)   // se o item selecionado foi o número 1, imprime tudo com cores normais
    {
      mvwprintw(janela, 1, 1, "Cores Normais.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");      //qualquer dúvida quanto às funções, pesquise man nome_da_função
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();          //espera o usuário digitar uma tecla para fechar a janela
      werase(janela);   //apaga tudo que está escrito na janela
      wrefresh(janela);
    }
  else if (item_selecionado == 2)      //imprime texto com A_BOLD,   ***  PROCURE ESSAS PALAVRAS NA BIBLIOTECA ***
    {
      wattron(janela, A_BOLD);
      mvwprintw(janela, 1, 1, "A_BOLD.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }
  else if (item_selecionado == 3)      //imprime texto com atributo A_UNDERLINE
    {
      wattron(janela, A_UNDERLINE);
      mvwprintw(janela, 1, 1, "A_UNDERLINE.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }
  else if (item_selecionado == 4)    //imprime texto com A_REVERSE
    {
      wattron(janela, A_REVERSE);
      mvwprintw(janela, 1, 1, "A_REVERSE.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }
  else if (item_selecionado == 5)        //A_BLINK
    {
      wattron(janela, A_BLINK);
      mvwprintw(janela, 1, 1, "A_BLINK.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");     
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }
  else if (item_selecionado == 6)    //A_STANDOUT
    {
      wattron(janela, A_STANDOUT);
      mvwprintw(janela, 1, 1, "A_STANDOUT.");
      wattron(janela, COLOR_PAIR(1));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(2));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(3));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(4));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }
  else if (item_selecionado == 7)    //A_ALTCHARSET
    {
      wattron(janela, A_ALTCHARSET);
      mvwprintw(janela, 1, 1, "A_ALTCHARSET.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");     
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }
  else if (item_selecionado == 8)    //A_ATTRIBUTES
    {
      wattron(janela, A_ATTRIBUTES);
      mvwprintw(janela, 1, 1, "A_ATTRIBUTES.");
      wattron(janela, COLOR_PAIR(5));
      mvwprintw(janela, 5, 3, "Texto: BLUE    Fundo: RED        ");
      wattron(janela, COLOR_PAIR(6));
      mvwprintw(janela, 6, 3, "Texto: GREEN   Fundo: YELLOW     ");
      wattron(janela, COLOR_PAIR(7));
      mvwprintw(janela, 7, 3, "Texto: BLACK   Fundo: CYAN       ");
      wattron(janela, COLOR_PAIR(8));
      mvwprintw(janela, 8, 3, "Texto: WHITE   Fundo: MAGENTA    ");
      wattron(janela, COLOR_PAIR(9));
      mvwprintw(janela, 13, 1, "Digite qualquer tecla para continuar.");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);
    }

  delwin(janela);        //deleta a janela
  touchwin(stdscr);
  refresh();
}

//======================================================================================

void imprimir_janela(int item_selecionado)      //função que cuidará das molduras que serão apresentadas ao usuário
{
  
  WINDOW *janela;

  init_pair(10, COLOR_WHITE, COLOR_BLUE);
  
  janela = newwin(15, 40, 20, 60);
  wbkgd(janela, COLOR_PAIR(10));
  wrefresh(janela);
  
  if (item_selecionado == 1)    //olhe, na função box, a moldura utilizada
    {
      box(janela, ACS_ULCORNER, ACS_URCORNER);
      mvwprintw(janela, 2, 3, "ACS_[UL, UR, LL, LR]CORNER");
      mvwprintw(janela, 3, 5, "- Vertical:   UL");
      mvwprintw(janela, 4, 5, "- Horizontal: UR");
      mvwprintw(janela, 6, 8, "LEGENDA");
      mvwprintw(janela, 7, 8, "- UL - Upper Left");
      mvwprintw(janela, 8, 8, "- UR - Upper Right");
      mvwprintw(janela, 9, 8, "- LL - Lower Left");
      mvwprintw(janela, 10, 8, "- LR - Lower Right");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }

  else if (item_selecionado == 2)
    {
      box(janela, ACS_LTEE, ACS_BTEE);
      mvwprintw(janela, 2, 3, "ACS_[B, T, L, R]TEE");
      mvwprintw(janela, 3, 5, "- Vertical:   L");
      mvwprintw(janela, 4, 5, "- Horizontal: B");
      mvwprintw(janela, 6, 8, "LEGENDA");
      mvwprintw(janela, 7, 8, "- B - Up");
      mvwprintw(janela, 8, 8, "- T - Down");
      mvwprintw(janela, 9, 8, "- L - Left");
      mvwprintw(janela, 10, 8, "- R - Right");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  if (item_selecionado == 3)
    {
      box(janela, ACS_VLINE, ACS_HLINE);
      mvwprintw(janela, 2, 3, "ACS_[V, H]LINE");
      mvwprintw(janela, 3, 5, "- Vertical:   V");
      mvwprintw(janela, 4, 5, "- Horizontal: H");
      mvwprintw(janela, 6, 8, "LEGENDA");
      mvwprintw(janela, 7, 8, "- V - Vertical");
      mvwprintw(janela, 8, 8, "- H - Horizontal");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  if (item_selecionado == 4)
    {
      box(janela, ACS_PLUS, ACS_DIAMOND);
      mvwprintw(janela, 2, 3, "ACS_PLUS & ACS DIAMOND");
      mvwprintw(janela, 3, 5, "- Vertical:   ACS_PLUS");
      mvwprintw(janela, 4, 5, "- Horizontal: ACS_DIAMOND");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }  
  if (item_selecionado == 5)
    {
      box(janela, ACS_S1, ACS_S9);
      mvwprintw(janela, 2, 3, "ACS_S[1, 3, 7, 9]");
      mvwprintw(janela, 3, 5, "- Vertical:   1");
      mvwprintw(janela, 4, 5, "- Horizontal: 9");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  if (item_selecionado == 6)
    {
      box(janela, ACS_CKBOARD, ACS_DEGREE);
      mvwprintw(janela, 2, 3, "ACS_CKBOARD & ACS_DEGREE");
      mvwprintw(janela, 3, 5, "- Vertical:   ACS_CKBOARD");
      mvwprintw(janela, 4, 5, "- Horizontal: ACS_DEGREE");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  if (item_selecionado == 7)
    {
      box(janela, ACS_PLMINUS, ACS_BULLET);
      mvwprintw(janela, 2, 3, "ACS_PLMINUS & ACS_BULLET");
      mvwprintw(janela, 3, 5, "- Vertical:   ACS_PLMINUS");
      mvwprintw(janela, 4, 5, "- Horizontal: ACS_BULLET");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  else if (item_selecionado == 8)
    {
      box(janela, ACS_RARROW, ACS_DARROW);
      mvwprintw(janela, 2, 3, "ACS_[U, D, L, R]ARROW");
      mvwprintw(janela, 3, 5, "- Vertical:   R");
      mvwprintw(janela, 4, 5, "- Horizontal: D");
      mvwprintw(janela, 6, 8, "LEGENDA");
      mvwprintw(janela, 7, 8, "- U - Up");
      mvwprintw(janela, 8, 8, "- D - Down");
      mvwprintw(janela, 9, 8, "- L - Left");
      mvwprintw(janela, 10, 8, "- R - Right");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }

  else if (item_selecionado == 9)
    {
      box(janela, ACS_BOARD, ACS_LANTERN);
      mvwprintw(janela, 2, 3, "ACS_BOARD & ACS_LANTERN");
      mvwprintw(janela, 3, 5, "- Vertical:   ACS_BOARD");
      mvwprintw(janela, 4, 5, "- Horizontal: ACS_LANTERN");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  else if (item_selecionado == 10)
    {
      box(janela, ACS_BLOCK, ACS_PI);
      mvwprintw(janela, 2, 3, "ACS_BLOCK & ACS_PI");
      mvwprintw(janela, 3, 5, "- Vertical:   ACS_BLOCK");
      mvwprintw(janela, 4, 5, "- Horizontal: ACS_PI");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }
  else if (item_selecionado == 11)
    {
      box(janela, ACS_LEQUAL, ACS_GEQUAL);
      mvwprintw(janela, 2, 3, "ACS_[L, G, N]EQUAL");
      mvwprintw(janela, 3, 5, "- Vertical:   L");
      mvwprintw(janela, 4, 5, "- Horizontal: G");
      mvwprintw(janela, 6, 8, "LEGENDA");
      mvwprintw(janela, 7, 8, "- L - Less");
      mvwprintw(janela, 8, 8, "- G - Greater");
      mvwprintw(janela, 9, 8, "- N - Not");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }

  else if (item_selecionado == 12)
    {
      box(janela, ACS_STERLING, ACS_STERLING);
      mvwprintw(janela, 2, 3, "ACS_STERLING");
      mvwprintw(janela, 3, 5, "- Vertical:   ACS_STERLING");
      mvwprintw(janela, 4, 5, "- Horizontal: ACS_STERLING");
      mvwprintw(janela, 13, 2, "Digite qualquer tecla para continuar");
      wrefresh(janela);
      getch();
      werase(janela);
      wrefresh(janela);   
    }

  delwin(janela);
  touchwin(stdscr);
  refresh();
  
}

//=========================================================================

void f1()
{
  int coluna = 0;       //inicialização de variáveis locais, só para não ficar usando números na função abaixo
  int numero_itens = 8;
  int item_selecionado;  //variável que guardará o item selecionado pelo usuário

  WINDOW **itens_menu;  //NÃO ENTENDI PORQUE, mas se o ponteiro itens_menu não for um ponteiro para ponteiro, o programa dá erros
  
  itens_menu = abrir_submenu(numero_itens, coluna);   //função que irá criar o submenu
  item_selecionado = cursor(itens_menu, numero_itens);    //o item_selecionado guardará o valor retornado pela função cursor
  remover_submenu(itens_menu, numero_itens);     //função removerá os menus e liberará a memória alocada
  touchwin(stdscr);
  refresh();
  if (item_selecionado != 0)       //se foi selecionada alguma coisa, se item selecionado não for igual à zero
    imprimir_cores(item_selecionado);
}

//===========================================================================
void f2()
{
  int coluna = 30;
  int numero_itens = 12;
  int item_selecionado;

  WINDOW **itens_menu;
  
  itens_menu = abrir_submenu(numero_itens, coluna);
  item_selecionado = cursor(itens_menu, numero_itens);    //mesma coisa acima citada
  remover_submenu(itens_menu, numero_itens);
  touchwin(stdscr);
  refresh();
  if (item_selecionado != 0)
    imprimir_janela(item_selecionado);
}

Scripts recomendados

Organizar variáveis em ordem crescente

Função boa para ler string em C

Exibe quantos números perfeitos foram digitados

Torres de Hanoi

Programa para cálculo vetorial


  

Comentários
[1] Comentário enviado por diegotosco em 15/12/2005 - 22:16h

Só uma coisa que eu esqueci de dizer, para compilar o programa é preciso linkar as ncurses, usando um -l<lib_a_ser_linkada>.

Por exemplo, para compilar este script, use:
$ gcc -o nome_do_executável Ncurses.c -lcurses

obs: é - (sinal de menos) l (L minúsculo) curses -> -lcurses.

Postem aqui em caso de dúvidas

Obrigado

[2] Comentário enviado por LucasRibeiro em 06/01/2008 - 22:59h

parabéns pela iniciativa, sou iniciante em programação e seu programa me ajudou muito a começar trabalhar com a ncurses , de uma olhada na função WINDOW ** abrir_submenu(int numero_itens, int coluna) pois o programa às vezes trava quando é chamada a função void remover_submenu(WINDOW **itens_menu, int numero_itens) isso porque a quantidade de memória que foi alocada é inferior à que está sendo liberada, veja : itens_menu = (WINDOW **) malloc(numero_itens * sizeof(WINDOW **)); o número de itens deveria ser numero_itens + 1 pois temos que contar com a subjanela que irá armazenar as outras subjanelas (itens_menu[0]). Espero não ter me atrapalhado muito na explicação, um abraço!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts