Conhecendo atributos do Ncurses
Publicado por Diego da Silva de Medeiros 12/12/2005
[ Hits: 9.347 ]
Homepage: www.sj.cefetsc.edu.br/~dsmedeiros
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
//___________________________________________________________ // 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); }
Programa para cálculo vetorial
Como verificar a validade de um CPF
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta