Enviado em 22/01/2014 - 17:19h
gente estou desenvolvendo umas telas para um programa de biblioteca que eu tenho aqui, certo, a parte dos menus já esta pronta, agora estou criando a integração para quando usar as setas fazer isso ou aquilo ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#define FUNDO 1
#define SOMBRA 2
#define JANELA 3
#define SELECAO1 4
#define SELECAO2 5
void inicia_ncurses()
{
initscr();
start_color();
init_pair(FUNDO,COLOR_BLACK,COLOR_BLUE);
init_pair(SOMBRA,COLOR_BLACK,COLOR_BLACK);
init_pair(JANELA,COLOR_BLACK,COLOR_CYAN);
init_pair(SELECAO1,COLOR_WHITE,COLOR_BLUE);
init_pair(SELECAO2,COLOR_GREEN,COLOR_BLACK);
noecho();
keypad(stdscr,TRUE);
cbreak();
curs_set(0);
}
WINDOW **cria_esqueleto(char *titulo)
{
WINDOW **esqueleto;
int tamanho=strlen(titulo);
esqueleto=(WINDOW **)malloc(3*sizeof(WINDOW *));
esqueleto[0]=newwin((LINES-2),(COLS-3),1,2);
wbkgd(esqueleto[0],COLOR_PAIR(SOMBRA));
wrefresh(esqueleto[0]);
esqueleto[1]=newwin((LINES-3),(COLS-3),1,1);
wbkgd(esqueleto[1],COLOR_PAIR(JANELA));
mvwprintw(esqueleto[1],2,(COLS/2)-(tamanho/2),titulo);
wrefresh(esqueleto[1]);
esqueleto[2]=newwin((LINES-10),(COLS-5),5,2);
box(esqueleto[2],0,0);
wbkgd(esqueleto[2],COLOR_PAIR(JANELA));
wrefresh(esqueleto[2]);
return esqueleto;
}
void redimensiona_esqueleto(WINDOW **esqueleto,char *titulo)
{
int cont,tamanho=strlen(titulo);
clear();
for(cont=0;cont<3;cont++)
wclear(esqueleto[cont]);
wresize(esqueleto[0],(LINES-2),(COLS-3));
wresize(esqueleto[1],(LINES-3),(COLS-3));
wresize(esqueleto[2],(LINES-10),(COLS-5));
box(esqueleto[2],0,0);
mvwprintw(esqueleto[1],2,(COLS/2)-(tamanho/2),titulo);
refresh();
for(cont=0;cont<3;cont++)
wrefresh(esqueleto[cont]);
sleep(1);
}
int largura_menu(char *titulo_menus[],int tam_vet_str)
{
int cont,tam=0,aux;
for(cont=0;cont<tam_vet_str;cont++)
{
aux=strlen(titulo_menus[cont]);
if(aux>tam)
tam=aux;
}
return tam;
}
WINDOW **cria_menus(char *titulo_menus[],int tam_vet_str)
{
WINDOW **menus;
int cont,tam;
tam=largura_menu(titulo_menus,tam_vet_str);
menus=(WINDOW **)malloc(tam_vet_str*sizeof(WINDOW *));
for(cont=0;cont<tam_vet_str;cont++)
{
menus[cont]=newwin(1,tam,cont+8,(COLS/2)-((tam/2)+1));
wbkgd(menus[cont],COLOR_PAIR(JANELA));
mvwprintw(menus[cont],0,0,titulo_menus[cont]);
wrefresh(menus[cont]);
}
return menus;
}
void redimensiona_menus(WINDOW **menus,char *titulo_menus[],int tam_vet_str)
{
int cont,tam;
tam=largura_menu(titulo_menus,tam_vet_str);
for(cont=0;cont<tam_vet_str;cont++)
{
mvwin(menus[cont],cont+8,(COLS/2)-((tam/2)+1));
wrefresh(menus[cont]);
}
sleep(1);
}
WINDOW **cria_submenu(char *titulo_menus[], int n_menus, char *titulo_submenu[],int tam_vet_str,int linha_inicio)
{
int cont,tam,tamM;
WINDOW **submenu;
tam=largura_menu(titulo_submenu,tam_vet_str);
tamM=largura_menu(titulo_menus,n_menus);
submenu=(WINDOW **)malloc(tam_vet_str*sizeof(WINDOW *));
for(cont=0;cont<tam_vet_str;cont++)
{
submenu[cont]=newwin(1,tam+2,cont+linha_inicio,(COLS/2)+((tamM/2)));
wbkgd(submenu[cont],COLOR_PAIR(SELECAO1));
mvwprintw(submenu[cont],0,1,titulo_submenu[cont]);
wrefresh(submenu[cont]);
}
return submenu;
}
WINDOW **exclui_submenu(WINDOW **esqueleto, WINDOW **submenu,int tam_vet_str)
{
int i;
for(i=0;i<tam_vet_str;i++)
{
delwin(submenu[i]);
wrefresh(esqueleto[2]);
box(esqueleto[2],0,0);
}
return NULL;
}
void seleciona_menus(WINDOW **menus,int tamanho,int local,int NORMAL, int SELECAO)
{
int i;
for(i=0;i<tamanho;i++)
{
wbkgd(menus[i],COLOR_PAIR(NORMAL));
wrefresh(menus[i]);
}
wbkgd(menus[local],COLOR_PAIR(SELECAO));
wrefresh(menus[local]);
}
void rolagem(WINDOW **menus,WINDOW **esqueleto,char *titulo_menus[],char *titulo_sms1[],char *titulo_sms2[],char *titulo_sms3[], int tam_vet_str,int *tam_vet_sm)
{
int key,cont=0,tam,ultimo_tam,ultimo_key=0,cont2=-1,penultimo_key=-1;
WINDOW **submenu=NULL;
do
{
key=getch();
if(key==KEY_DOWN || key=='\t')
{
tam=largura_menu(titulo_menus,tam_vet_str);
if(cont>=0 && cont<tam_vet_str)
{
if(submenu!=NULL)
submenu=exclui_submenu(esqueleto,submenu,ultimo_tam);
seleciona_menus(menus,tam_vet_str,cont,JANELA,SELECAO1);
if(cont==0)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms1,tam_vet_sm[0],8);
ultimo_tam=tam_vet_sm[0];
}
else
{
if(cont==1)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms2,tam_vet_sm[1],9);
ultimo_tam=tam_vet_sm[1];
}
else
{
if(cont==2)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms3,tam_vet_sm[2],10);
ultimo_tam=tam_vet_sm[2];
}
}
}
cont++;
}
else
{
cont=0;
if(submenu!=NULL)
submenu=exclui_submenu(esqueleto,submenu,ultimo_tam);
seleciona_menus(menus,tam_vet_str,cont,JANELA,SELECAO1);
if(cont==0)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms1,tam_vet_sm[0],8);
ultimo_tam=tam_vet_sm[0];
}
cont++;
}
}
else
{
if(key==KEY_UP)
{
if(cont>=0 && cont<tam_vet_str)
{
if(submenu!=NULL)
submenu=exclui_submenu(esqueleto,submenu,ultimo_tam);
seleciona_menus(menus,tam_vet_str,cont,JANELA,SELECAO1);
if(cont==0)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms1,tam_vet_sm[0],8);
ultimo_tam=tam_vet_sm[0];
}
else
{
if(cont==1)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms2,tam_vet_sm[1],9);
ultimo_tam=tam_vet_sm[1];
}
else
{
if(cont==2)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms3,tam_vet_sm[2],10);
ultimo_tam=tam_vet_sm[2];
}
}
}
cont--;
}
else
{
cont=tam_vet_str-1;
if(submenu!=NULL)
submenu=exclui_submenu(esqueleto,submenu,ultimo_tam);
seleciona_menus(menus,tam_vet_str,cont,JANELA,SELECAO1);
if(cont==2)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms3,tam_vet_sm[2],10);
ultimo_tam=tam_vet_sm[2];
}
cont--;
}
}
else
{
if(key=KEY_RIGHT && cont2==-1)
{
if(penultimo_key==KEY_UP)
{
if(cont>=0 && cont<tam_vet_str-1)
cont++;
else
if(cont<tam_vet_str)
cont=0;
}
else
{
if(penultimo_key==KEY_DOWN)
{
if(cont>=1 && cont<tam_vet_str)
cont--;
else
if(cont==tam_vet_str)
cont=tam_vet_str-1;
}
}
if(ultimo_key==KEY_LEFT)
{
if(cont==0)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms1,tam_vet_sm[0],8);
ultimo_tam=tam_vet_sm[0];
}
else
{
if(cont==1)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms2,tam_vet_sm[1],9);
ultimo_tam=tam_vet_sm[1];
}
else
{
if(cont==2)
{
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms3,tam_vet_sm[2],10);
ultimo_tam=tam_vet_sm[2];
}
}
}
}
cont2=0;
if(submenu!=NULL)
{
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2=-1;
}
do
{
key=getch();
if(key==KEY_UP)
{
if(cont2>=0 && cont2<ultimo_tam)
{
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2--;
}
else
{
cont2=ultimo_tam-1;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2--;
}
}
else
{
if(key==KEY_DOWN)
{
if(cont2>=0 && cont2<ultimo_tam)
{
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2++;
}
else
{
cont2=0;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2++;
}
}
}
}while(key!=KEY_LEFT);
cont2=-1;
submenu=exclui_submenu(esqueleto,submenu,ultimo_tam);
redimensiona_menus(menus,titulo_menus,tam_vet_str);
}
else
{
if(key==KEY_F(1))// não entra nessa comparação
{
attron(COLOR_PAIR(SELECAO2));
printw("entrou");
attroff(COLOR_PAIR(SELECAO2));
seleciona_menus(menus,tam_vet_str,0,JANELA,SELECAO1);
if(ultimo_key==KEY_LEFT || ultimo_key==0)
submenu=cria_submenu(titulo_menus,tam_vet_str,titulo_sms1,tam_vet_sm[0],8);
key=getch();
if(key==KEY_RIGHT && cont2==-1)
{
cont2=0;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2=-1;
do
{
key=getch();
if(key==KEY_UP)
{
if(cont2>=0 && cont2<ultimo_tam)
{
if(cont2==-1)
cont2=ultimo_tam-1;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2--;
}
else
{
cont2=ultimo_tam-1;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2--;
}
}
else
{
if(key==KEY_DOWN)
{
if(cont2>=0 && cont2<ultimo_tam)
{
if(cont2==-1)
cont2=1;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2++;
}
else
{
cont2=0;
seleciona_menus(submenu,ultimo_tam,cont2,SELECAO1,SELECAO2);
cont2++;
}
}
}
}while(key!=KEY_LEFT);
cont2=-1;
submenu=exclui_submenu(esqueleto,submenu,ultimo_tam);
redimensiona_menus(menus,titulo_menus,tam_vet_str);
}
}
}
}
}
if(key==KEY_DOWN || KEY_UP)
penultimo_key=key;
if(key==KEY_LEFT || KEY_RIGHT)
ultimo_key=key;
}while(3000);
}
void main()
{
WINDOW **esqueleto, **menus;
char titulo[10],*titulo_menus[3],tm1[27],tm2[27],tm3[27];
char *titulo_submenu1[2],tsm1_1[14],tsm1_2[14];
char *titulo_submenu2[4],tsm2_1[14],tsm2_2[14],tsm2_3[20],tsm2_4[21];
char *titulo_submenu3[6],tsm3_1[20],tsm3_2[12],tsm3_3[20],tsm3_4[20],tsm3_5[18],tsm3_6[20];
int tam_vet_sm[3];
strcpy(titulo,"BIBLIOTECA");
strcpy(tm1,"(F1) CADASTRO DE LIVROS -->");
strcpy(tm2,"(F2) CADASTRO DE ALUNOS -->");
strcpy(tm3,"(F3) EMPRESTIMOS -->");
titulo_menus[0]=tm1;
titulo_menus[1]=tm2;
titulo_menus[2]=tm3;
strcpy(tsm1_1,"INSERIR LIVROS");
strcpy(tsm1_2,"EXCLUIR LIVROS");
titulo_submenu1[0]=tsm1_1;
titulo_submenu1[1]=tsm1_2;
strcpy(tsm2_1,"INSERIR ALUNOS");
strcpy(tsm2_2,"EXCLUIR ALUNOS");
strcpy(tsm2_3,"QUANTIDADE DE ALUNOS");
strcpy(tsm2_4,"VERIFICAR EMPRESTIMOS");
titulo_submenu2[0]=tsm2_1;
titulo_submenu2[1]=tsm2_2;
titulo_submenu2[2]=tsm2_3;
titulo_submenu2[3]=tsm2_4;
strcpy(tsm3_1,"REALIZAR EMPRESTIMOS");
strcpy(tsm3_2,"IMPRIME TUDO");
strcpy(tsm3_3,"CANCELAR EMPRESTIMOS");
strcpy(tsm3_4,"DEVOLVER EMPRESTIMOS");
strcpy(tsm3_5,"LIVROS DISPONIVEIS");
strcpy(tsm3_6,"DEVOLVER EMPRESTIMOS");
titulo_submenu3[0]=tsm3_1;
titulo_submenu3[1]=tsm3_2;
titulo_submenu3[2]=tsm3_3;
titulo_submenu3[3]=tsm3_4;
titulo_submenu3[4]=tsm3_5;
titulo_submenu3[5]=tsm3_6;
tam_vet_sm[0]=2;
tam_vet_sm[1]=4;
tam_vet_sm[2]=6;
inicia_ncurses();
bkgd(COLOR_PAIR(FUNDO));
refresh();
esqueleto=cria_esqueleto(titulo);
menus=cria_menus(titulo_menus,3);
rolagem(menus,esqueleto,titulo_menus,titulo_submenu1,titulo_submenu2,titulo_submenu3,3,tam_vet_sm);
/*for(;;)
{
redimensiona_esqueleto(esqueleto,titulo);
redimensiona_menus(menus,titulo_menus,3);
}*/
}
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
como instalar o docker desktop e o docker no debian 12 arm64 (11)