Ir ao conteúdo

Posts recomendados

Postado
        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
Postado

@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
Postado

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
Postado

@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 1
  • Amei 1
Postado

@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

Postado

@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

Postado

@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?

 

Postado

@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 .

  • Amei 1
Postado

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 1
Postado

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 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...