Menu com setas em C

1. Menu com setas em C

vinicius
vinicius_souza

(usa Ubuntu)

Enviado em 07/12/2012 - 18:48h

Pessoal, Gostaria de fazer um menu em C que utilizasse as setas para se movimentar.
http://www.4shared.com/photo/OBwYn37e/Sem_ttulo.html?
nesse link tem uma imagem de como eu quero ele porém ela esta um pouco confusa e o que eu quero dizer é o seguinte, essa tarja branca tem uma frase que eu ocultei ao postar e se o usuário pressionar enter irá chamar uma função, se ele apertar a tecla para baixo a tarja mudará para baixo e assim por diante.
Fui claro na pergunta?
Desde já agradeço.


  


2. Re: Menu com setas em C

Felipe Pereira Miranda
felipe300194

(usa Fedora)

Enviado em 07/12/2012 - 20:27h

Eu nunca fiz algo do tipo, mas se não me engano é necessário a biblioteca ncurses.h (equivalente a conio.h do Windows) e a biblioteca graphics.h para algo mais elaborado. Mas claro isso foi algo que pesquisei a algum tempo por isso não me lembro muito bem, mas já é um bom caminho =)


3. Re: Menu com setas em C

???
gokernel

(usa Linux Mint)

Enviado em 07/12/2012 - 23:05h

serve um exemplo de código GUI com menu usado a API WIN32 somente para windows ???

OBS: sei que vc é iniciante e a GUI do windows não é indicada para iniciante.


4. Re: Menu com setas em C

vinicius
vinicius_souza

(usa Ubuntu)

Enviado em 10/12/2012 - 13:56h

Eu prefiro que seja feito pelo próprio C sem uso de um GUI.
Vi esse jogo que o cara fez usando getch para pegar a tecla e fazer o jogo funcionar (http://www.vivaolinux.com.br/script/Joguinho-de-labirinto-usando-as-setas-do-teclado).
Não dá pra fazer algo parecido só que ao invés da tarja branca um simbolo subindo e descendo na tela?
Desde já agradeço.
Att:Vinícius


5. Re: Menu com setas em C

vinicius
vinicius_souza

(usa Ubuntu)

Enviado em 11/12/2012 - 23:27h

Pessoal,
Não fiz da melhor forma possível mais como o meu cód é pequeno, eu consegui fazer de uma forma que ficou "visualmente" até legal, amanhã vou postar o cód pra vcs.
A idéia era mecher a tarja ou seja o cursor só que ao invés disso eu mechi foi a tela.



6. Re: Menu com setas em C

vinicius
vinicius_souza

(usa Ubuntu)

Enviado em 12/12/2012 - 01:19h

OI pessoal o cód é esse ai

#include <stdio.h>
//compilei pelo windows algumas opções não funcionam no linux mas o molde ta pronto.
#include <windows.h>

//
//Esses códigos abaixos são pelos pelo getch();
//e retornam um numero inteiro.
//Esse numero representa as teclas do teclado, (setas,enter,esc).
//

#define acima 72
#define abaixo 80
#define esc 27
#define enter 13

void inicio1(void)
{
system("cls");
printf("\n ÚÄÄÄÄÄÄÄ Menu Principal ÄÄÄÄÄÄÄ¿\n");
printf(" ³ ³\n");
//no lugar da tarja branca eu coloquei esse Û que no prompt do windows é um quadrado.
printf(" ³ Û Retornar em main ³\n");
printf(" ³ Chamar outra funcao ³\n");
printf(" ³ ³\n");
printf(" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
int ch;
ch=getch();
if (ch==esc)
system("exit");
else if (ch==enter)
main();
else if (ch==224)
ch=getch();
if (ch==acima)
inicio02();
else if (ch==abaixo)
inicio02();
else
inicio1();
}
inicio02()
{
system("cls");
printf("\n ÚÄÄÄÄÄÄÄ Menu Principal ÄÄÄÄÄÄÄ¿\n");
printf(" ³ ³\n");
printf(" ³ Retornar em main ³\n");
printf(" ³ Û Chamar outra funcao ³\n");
printf(" ³ ³\n");
printf(" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
int ch;
ch=getch();
if (ch==esc)
system("exit");
else if (ch==enter)
funcao_enter();
else if (ch==224)
ch=getch();
if (ch==acima)
inicio1();
else if (ch==abaixo)
inicio1();
else
inicio02();
}
funcao_enter()
{
system("cls");
printf("\n ÚÄÄÄÄÄÄÄÄ Menu Funcao ÄÄÄÄÄÄÄÄ¿\n");
printf(" ³ ³\n");
printf(" ³ Û Retornar menu principal ³\n");
printf(" ³ ³\n");
printf(" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
int ch;
ch=getch();
if (ch==esc)
inicio02();
else
funcao_enter();
}
main ()
{
inicio1();
}

concerteza existe outra forma mas a que eu consegui fazer agora é essa


7. Re: Menu com setas em C

???
gokernel

(usa Linux Mint)

Enviado em 12/12/2012 - 07:05h


dicas para vc melhor codar em C no geral pegando o seu programa por exemplo:

01 - criar macros sempre com letras MAIÚSCULAS, exemplo:
#define NOME_DO_MACRO 100
e nao assim
#define nome_do_macro 100

02 - aprenda a trabalhar com ( loop principal ) no programa ... ISTO É MUITO IMPORTANTE.

03 - o prototipo básico da funcao main é assim:



int main (void)
{
// ... seu código

return 0;
}

ou assim quando usar parâmetros:

int main ( int argc, char *argv[] )
{
// código

return 0;
}



siga essas dicas que são para o seu bem .



8. Re: Menu com setas em C

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 12/12/2012 - 16:12h

Eu faria assim pra coisa ficar mais "dinamica"!

Como pode ver, o uso do loop reduz consideravelmente o trabalho em renderizar as telas... mas desta forma qualquer abordagem que você tome vai lhe dar bastante trabalho para criar as telas dinamicas...

Então, tente fazer da forma mais simples possivel e usando o menos código para que o seu programa não vire um "monstro".


#include <stdio.h>

#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_ESC 27
#define KEY_ENTER 13

/**
* Function Prototypes
*/
void menu_draw();

/**
* Main function
*/
int main (int argc, char ** argv)
{
// chama a função para o desenho do menu
menu_draw();
return 0;
}

/**
* Desenha Menu function
*/
void menu_draw ()
{
int key = 0;
while(1)
{
system("cls");
printf("\n ÚÄÄÄÄÄÄÄ Menu Principal ÄÄÄÄÄÄÄ¿\n");
printf(" ³ ³\n");
printf(" ³ %s Retornar em main ³\n", (key == KEY_UP)? "Û": " ");
printf(" ³ %s Chamar outra funcao ³\n", (key == KEY_DOWN)? "Û": " ");
printf(" ³ ³\n");
printf(" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n");
key = getch(); // get key pressed

if (key == KEY_ESC)
return;
}
}


Espero ter ajudado brow!

my 2cents


9. Re: Menu com setas em C

vinicius
vinicius_souza

(usa Ubuntu)

Enviado em 12/12/2012 - 17:22h

mas dessa forma não dá pra utilizar o enter e se eu quiser mais linha também num dá não.
Pelo menos eu não vejo uma forma simples assim com essa opções


10. Re: Menu com setas em C

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 13/12/2012 - 06:58h


Bom dia cara,

Meu intuito em mostrar o fonte acima foi para deixá-lo ciente de como se poderia minimizar os esforços em construir o algoritmo que você mostrou usando uma estrutura de repetição (loop).

Claro que, como eu já disse, não há como fugir de se ter um "trabalho de corno" quando se quer criar um renderizador de tela from scratch... sugiro o uso do curses (https://en.wikipedia.org/wiki/Curses_%28programming_library%29) para não ficar se matando a toa ou reinventando a roda... garanto que será mais fácil! ;-)

Meu exemplo não cobre todos os senários que você provavelmente precisará, então você precisará fazer modificações para que o algoritmo possa ser aderente as suas necessidades...

Algumas dicas são:
- Struct para definir as opções (textos do menu) e o fluxo (para onde esta opção me leva).
- Loop para montar as opções para que, independente de quantas, eu possa construí-las e navegar por elas.
- "Listener" para realizar mudança da opção (setas do teclado), definir qual a opção selecionada e seguir o fluxo (abrir a opção quando o enter for pressionado).

my 2cents,