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);
}*/
}
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Minha rede tem um espaço invisível que não dá pra digitar o nome da re... (1)
Pedagogia no brasil não passa de alfabetização por m4sturbação mental ... (2)
compilação samba 4.22 rock linux 9.5 (3)
Erro de segmentação «Segmentation fault (core dumped)» ao retornar obj... (7)