Ir ao conteúdo
  • Cadastre-se
ytalopaulo_

C Como utilizar as SETAS (cima e baixo) e ENTER do teclado no menu de um programa?

Recommended Posts

        printf("MENU\n");

        printf("\t1->ADICIONAR SÉRIES\n");
        printf("\t2->EDITAR SÉRIE\n");
        printf("\t3->REMOVER SÉRIE\n");
        printf("\t4->lISTAR SÉRIES\n");
        printf("\t5->PESQUISAR SÉRIES\n");
        printf("\t6->SAIR\n");

        printf("OPÇÃO: ");
        scanf("%d",&opPrinc);

Estou criando um programa e no momento o menu está sendo feito com a estrutura do/wihle e switch-case. Gostaria de saber como fazer com que a movimentação de escolha das opções do menu fosse feita através das teclas de setar (cima e baixo) e quando clicar em ENTER a opção escolhida fosse acessada?  (Eliminando então a forma como esta, o usuário digitar o nº correspondente as opções.)

  • Amei 1
  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ytalopaulo_ Se você está trabalhando em modo texto, deve fazer uma lógica para reexibir todo o menu a cada acionamento de setas, alterando a cor do item selecionado e, ao mesmo tempo, contar quantas vezes cada uma é pressionada; com esta contabilização, você deduz que item foi selecionado ao dar enter.

Pode ser que já exista uma library que faz este trabalho; se você encontrar fica mais fácil, senão terá que programar na unha.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não há uma maneira simples de fazer isso usando as bibliotecas padrão do C, seria necessário usar bibliotecas de terceiros, acredito que a biblioteca curses.h disponibiliza recursos para fazer esse tipo de coisa, ou então seria necessário implementar você mesmo todo o funcionamento do menu, como o @T1000_2015 indicou.

 

Mas a pergunta é se vale a pena fazer isto, pois nesse caso provavelmente seria mais negócio partir para uma interface gráfica ao invés de uma tela no terminal cmd.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ytalopaulo_     você pode usar uma interface gráfica como o @isrnick  disse ,   mas é uma pena que para fazer interface gráficas seja uma tarefa bem difícil ,  então se você quiser fazer pelo terminal você pode usar o comando kbhit()  para saber se foi pressionada alguma tecla e nesse caso pegar o valor da tecla pressionada usando o comando getch() ,  no lugar desse scanf , assim se  pressionar seta para cima ele retorna o valor 72 e se pressionar seta para baixo  o valor será 80 , com isso você controla o valor da linha onde posicionar o cursor , e usa esse valor da linha no switch para ir para cada uma daquelas opções , e para posicionar o cursor na linha e coluna você  pode usar essa função gotoxy()  :

#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include <windows.h>
/*             0     1    2     3   4      5     6       7         8      */
typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;
/* 9         10        11        12        13          14    15          */
static int __BACKGROUND = BLACK;
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int letra, int fundo){
    __FOREGROUND = letra;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letra + (__BACKGROUND << 4));
}
void gotoxy(int x,int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void adicionar_series(){
    textcolor(3,14);/* primeiro cor letra segundo cor fundo */
    printf("Adicionando series . . . !    tecle");
    getch();
}
void editar_series(){
    textcolor(12,15);
    printf("Editando series . . . !    tecle");
    getch();
}
void remover_series(){
    textcolor(15,12);
    printf("Removendo Series . . . !    tecle");
    getch();
}
void listar_series(){
    textcolor(10,6);
    printf("Listando Series . . . !    tecle");
    getch();
}
void pesquisar_series(){
    textcolor(15,0);
    printf("Pesquisando Series . . . !   tecle");
    getch();
}
void sair(){
    textcolor(11,3);
    gotoxy(0,20);
    printf("Saindo . . . !    tecle\n\n");
    getch();
    textcolor(7,0);
    exit(0);
}
int main(){
    int li=1,tecla;
    setlocale(LC_ALL,"");
    do{
        textcolor(7,0);
        system("cls");
        printf("\t\tMENU\n");
        printf("\t1 - ADICIONAR SÉRIES\n");
        printf("\t2 - EDITAR    SÉRIES\n");
        printf("\t3 - REMOVER   SÉRIES\n");
        printf("\t4 - lISTAR    SÉRIES\n");
        printf("\t5 - PESQUISAR SÉRIES\n");
        printf("\t6 - SAIR\n");
        printf("\t   OPÇÃO: ");
        gotoxy(4,li);
        printf("->");
        gotoxy(79,24);
        do{
            tecla=0;
            if(kbhit()){
                tecla = getch();
                gotoxy(4,li);
                printf("  ");
                if(tecla==224)
                    tecla = getch();
                if(tecla == 72)
                    li--;
                else
                    if(tecla == 80)
                        li++;
                if(li > 6)
                    li=1;
                else
                    if(li < 1)
                        li=6;
                gotoxy(4,li);
                printf("->");
                gotoxy(79,24); /* se não quiser que cursor fique piscando ali */
            }
        }while(tecla != 13);
        system("cls");
        switch(li){
        case 1:
            adicionar_series();
            break;
        case 2:
            editar_series();
            break;
        case 3:
            remover_series();
            break;
        case 4:
            listar_series();
            break;
        case 5:
            pesquisar_series();
            break;
        case 6:
            sair();
        }
    }while(li != 6);
    textcolor(7,0);
    return 0;
}

 

  • Curtir 2
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ytalopaulo_ Olá. Vê se é algo assim que você deseja fazer:

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>

int tecla() {

    int varTecla;

    while (1) {
        if (kbhit()) {
            varTecla = getch();
            return varTecla;
        }
    }
}

void sair() {

    int c;
    int lugar = 0;
    system("cls");

    printf("\n\t   Deseja jogar novamente?\n\n");
    printf("\n\t\t[  Sim  ]\n"
           "\t\t   Nao   \n\n\n");

    while (1) {
        if (kbhit()) {
            system("cls");
            printf("\n\t   Deseja jogar novamente?\n\n");
            c = tecla();

            if (c == 80) { //apertou para baixo
                lugar++;
                if (lugar > 1)
                    lugar = 0;
            }
            if (c == 72) {  //apertou para cima
                lugar--;
                if (lugar < 0)
                    lugar = 1;
            }
            if (c == 75) { //apertou para direita
                lugar++;
                if (lugar > 1)
                    lugar = 0;
            }
            if (c == 77) {  //apertou para esquerda
                lugar--;
                if (lugar < 0)
                    lugar = 1;
            }
            if (c == 13)  {  //apertou [enter]
                if (lugar == 0) {
                    // comando para reiniciar o programa
                } else if (lugar == 1) {
                    system("cls");
                    printf("\n\n\t     voce saiu do programa!!!\n\n");
                    Sleep(2800);
                    exit(0);
                }
            }
            if (lugar == 0) {
                printf("\n\t\t[  Sim  ]\n"
                       "\t\t   Nao   \n\n\n");
            }
            if (lugar == 1) {
                printf("\n\t\t   Sim   \n"
                       "\t\t[  Nao  ]\n\n\n");
            }
        }
    }
}

int main(void) {

    sair();

    return 0;
}

Nesse exemplo eu estou criando um menu "na mão" mesmo

  • Curtir 3
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010  Exatamente assim, onde que eu posso mudar pra a "->" fica na posição que eu quero, meu menu fica mais embaixo pois tem um cabeçalho em cima, modifiquei os números mas fica errado rs... ?

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ytalopaulo_ Olá. Seria importante entender bem a lógica q é usada.

Para fazer a mudança q você deseja, pegando o exemplo q passei, basta mudar nas linhas abaixo:

printf("\n\t   Deseja jogar novamente?\n\n");
printf("\n\t\t->  Sim   \n"
         "\t\t    Nao   \n\n\n");

E, também mudar nessa parte:

if (lugar == 0) {
    printf("\n\t\t->  Sim   \n"
             "\t\t    Nao    \n\n\n");
}
if (lugar == 1) {
    printf("\n\t\t    Sim    \n"
             "\t\t->  Nao   \n\n\n");
}

Basta pegar o código postado acima e mudar nessas partes q passei.

Mas é importante entender a lógica para daí ser possível criar um menu com mais opcões

Se tiver dúvidas é só perguntar, ok?

adicionado 17 minutos depois

@ytalopaulo_ Depois q entender a lógica fica fácil criar um menu como desejar.

Segue o mesmo código agora com 3 opções:

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>

int tecla() {
    int varTecla;
    while (1) {
        if (kbhit()) {
            varTecla = getch();
            return varTecla;
        }
    }
}

void sair() {

    int c;
    int lugar = 0;
    system("cls");

    printf("\n\t       Selecione uma opcao:\n\n");
    printf("\n\t\t->  Opcao  1   \n"
           "\t\t    Opcao  2   \n"
           "\t\t      Sair    \n\n\n");

    while (1) {
        if (kbhit()) {
            system("cls");
            printf("\n\t       Selecione uma opcao:\n\n");
            c = tecla();

            if (c == 80) { //apertou para baixo
                lugar++;
                if (lugar > 2)
                    lugar = 0;
            }
            if (c == 72) {  //apertou para cima
                lugar--;
                if (lugar < 0)
                    lugar = 2;
            }
            if (c == 75) { //apertou para direita
                lugar++;
                if (lugar > 2)
                    lugar = 0;
            }
            if (c == 77) {  //apertou para esquerda
                lugar--;
                if (lugar < 0)
                    lugar = 2;
            }
            if (c == 13)  {  //apertou [enter]
                if (lugar == 0) {
                    printf("\n\n\tVoce selecionou a opcao 1!\n\n\n");
                    system("pause");
                    exit(0);
                } else if (lugar == 1) {
                    printf("\n\n\tVoce selecionou a opcao 2!\n\n\n");
                    system("pause");
                    exit(0);
                } else if (lugar == 2) {
                    system("cls");
                    printf("\n\n\t     voce saiu do programa!!!\n\n");
                    Sleep(2800);
                    exit(0);
                }
            }
            if (lugar == 0) {
                printf("\n\t\t->  Opcao  1   \n"
                       "\t\t    Opcao  2   \n"
                       "\t\t      Sair    \n\n\n");

            }
            if (lugar == 1) {
                printf("\n\t\t    Opcao  1   \n"
                       "\t\t->  Opcao  2   \n"
                       "\t\t      Sair    \n\n\n");

            }
            if (lugar == 2) {
                printf("\n\t\t    Opcao  1   \n"
                       "\t\t    Opcao  2   \n"
                       "\t\t->    Sair    \n\n\n");
            }
        }
    }
}
int main(void) {

    sair();

    return 0;
}

É só questão de praticar mesmo

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Não sei se o @ytalopaulo_ se referiu ao meu código ou ao seu rs... . Creio q seria interessante esperar ele se pronunciar. :thumbsup:

Se me equivoquei se deve ao fato d você, a princípio, ter postado uma resposta mas não lembro d q postou um código. Inclusive você havia mencionado as funções kbhit e getch.

E já aproveitando... não sei se foi aqui você falou sobre o Alegro e até postou o link para baixar e supostamente fazer uso dessa biblioteca.

Agora entra a pergunta: Como instalar o Alegro no Code Blocks e poder fazer uso desse recurso p interface gráfica. O Alegro é mais ou menos complexo q a Win32 API (ouvi um comentário q seria interessante começar com alguma coisa não tão avançada como a Win32 API). Está correto isso?

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ytalopaulo_     para posicionar o menu mais para baixo você precisa ver em qual linha da tela está a primeira opção do menu e na chamada da função gotoxy você coloca o segundo valor ,  que é a variável  li ,  somado com o valor da linha onde está a primeira opção do menu ,  por exemplo se essa primeira opção estiver na linha 10 então coloca li+10  assim  :

do{
    tecla=0;
    if(kbhit()){
    tecla = getch();
    gotoxy(4,li+10);/* se a opção 1 estiver na linha 10 */
    /* e coloca assim em todas as chamadas da função gotoxy */
    printf("  ");

 

@giu_d    eu ainda não usei essa biblioteca Allegro , apenas vi um post sobre ela aqui no fórum já algum tempo então não sei qual é melhor/mais fácil , mas pelo que vi parece que a Allegro seja mais fácil , mas só experimentando para saber , e também não tenho ela instalada e também ainda não sei como instala-la ,   espero que algum  colegas aqui do fórum , com mais experiência ,  possa te ajudar  .   seu código ficou muito bom  e ficaria melhor se você usasse cores para destacar a opção escolhida .

  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado gente,  vou tentar assimilar tudo que foi dito nesse post e acrescentar no meu código.  

O método que @devair1010  colocou aqui foi o mais próximo que se aproximou do que eu queria, mas agradeço a todos pelo tempo que tiveram pra me ajudar, valeu. 

  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se vai te ajudar estou começando a aprender agora eu pesquisei na net e achei esse até to usando em um programa de estoque, já vou pedindo desculpa pelos comentários mal feito, mas acho que da pra ficar brincando com esse ai.

 

#include <stdio.h>//Desculpe não lembro qual dessas aqui é a de ler o teclado
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <dirent.h>
using namespace std;

void gotoxy(int x, int y);//permite a movimentação(eu acho)

int main(){

         inicio:
    int opcao = 1, x = 3;
    bool sair = true;

        system("cls");
    system("color 1F");//Muda cor do CMD para azul
    gotoxy(0,0); printf("**************************************");
    gotoxy(0,1); printf("*Programa Estoque*");
    gotoxy(0,2); printf("******************");
    gotoxy(2,3); printf("->");
    gotoxy(0,3); printf("*");
    gotoxy(0,4); printf("*");
    gotoxy(0,5); printf("*");
    gotoxy(0,6); printf("*");
    gotoxy(0,7); printf("******************");
    gotoxy(17,3); printf("*");
    gotoxy(17,4); printf("*");
    gotoxy(17,5); printf("*");
    gotoxy(17,6); printf("*");
    gotoxy(17,7); printf("*********************");
    gotoxy(37,1); printf("*");
    gotoxy(37,2); printf("*");
    gotoxy(37,3); printf("*");
    gotoxy(37,4); printf("*");
    gotoxy(37,5); printf("*");
    gotoxy(19,3); printf("Ver 1.0");
        gotoxy(5,3); printf("Cadastrar");
        gotoxy(5,4); printf("Lancar Qant");
        gotoxy(5,5); printf("Ver Produto");
        gotoxy(5,6); printf("Listar Todos");
        gotoxy(37,6); printf("*");

    while(sair){




        system("pause>nul");//pausa o programa permitindo a moviemntação(eu acho)

        if(GetAsyncKeyState(VK_ESCAPE)){//ESC para voltar ao inicio a qual quer momento

                    goto inicio;
           }



        if(GetAsyncKeyState(VK_DOWN) && x != 6) {//Tecla Baixo
            gotoxy(2,x); printf("  ");
            x++;
            gotoxy(2,x); printf("->");
            opcao++;
            continue;
        }
        if(GetAsyncKeyState(VK_UP) && x != 3){//tecla Acima
            gotoxy(2,x); printf("  ");
            x--;
            gotoxy(2,x); printf("->");
            opcao--;
            continue;
        }
        if(GetAsyncKeyState(VK_RETURN)){//Retorno da opção, tecla ENTER
            switch (opcao) {
            case 1://só ir adicionando case e adicionando lá em cima

           gotoxy(10,10), cout<<"TESTE";


            }
        }
    }
}


void gotoxy(int x, int y)//permite a mexer com a seta, nao sei como funciona muito esse treco aqui então é só isso
{
    HANDLE hCon;
    COORD dwPos;

    dwPos.X = x;
    dwPos.Y = y;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hCon,dwPos);
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×