IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[DOS/Windows CONIO] Probleme touche enter


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 53
    Points : 44
    Points
    44
    Par défaut [DOS/Windows CONIO] Probleme touche enter
    bonjour,
    j'aimerais faire un menu avec getch, mais j'ai un petit probleme lorsque j'appuie sur la touche enter !

    en gros mon menu propose differents choix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      >>>  jouer
             scores
             regle
             quitter
    en appuyant sur les fleches haut et bas, les ' >>> ' se deplace dans les menu :après avoir appuyé sur bas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
             jouer
     >>>  scores
             regle
             quitter
    j'aimerais que lorsque j'appuie sur la touche enter, mon choix se valide, et lance la fonction approprié
    Donc si le curseur est sur jouer, que j'appuie sur enter, alors que le programme lance la fonction de jeu !!

    MAIS, quand je veux valider, je suis obligé d'appuyer 2 fois sur la touche enter pour que ça fonctionne si j'appuie une fois, puis que j'appuie sur une autre touche, rien ne se passe... je ne comprends pas !!

    Je vous met mon code, désolé pour l'alignement, mais je ne sais pas bien comment bien aligner !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    int ChoixMenu()
    {
      int x=7,y=9,quitter=0;
      gotoxy(x,y);
      textbackground(12);
      textcolor(10);
      printf(">>>");
      int ch=getch();
      while(ch!=32){
                    if(ch==0 || ch==224){
                                         ch=getch();
                                         switch(ch){
                                                    case 72:if(y==17){
                                                                     gotoxy(x,y);
                                                                     printf("   ");
                                                                     y=15;
                                                                     gotoxy(x,y);
                                                                     printf(">>>");
                                                                     }
                                                            else{
                                                                 if(y==15){
                                                                     gotoxy(x,y);
                                                                     printf("   ");
                                                                     y=13;
                                                                     gotoxy(x,y);
                                                                     printf(">>>");
                                                                     }
                                                                  else{
                                                                       if(y==13){
                                                                          gotoxy(x,y);
                                                                          printf("   ");
                                                                          y=11;
                                                                          gotoxy(x,y);
                                                                         printf(">>>");
                                                                         }
                                                                  else{
                                                                       if(y==11){
                                                                           gotoxy(x,y);
                                                                           printf("   ");
                                                                           y=9;
                                                                           gotoxy(x,y);
                                                                           printf(">>>");
                                                                                 }
                                                                      else{
                                                                           gotoxy(x,y);
                                                                           printf("   ");
                                                                           y=17;
                                                                           gotoxy(x,y);
                                                                           printf(">>>");
                                                                          }
     
                                                                       }
     
                                                                  }
                                                                 }
                                                         break;
                                                    case 80:if(y==9){
                                                                     gotoxy(x,y);
                                                                     printf("   ");
                                                                     y=11;
                                                                     gotoxy(x,y);
                                                                     printf(">>>");
                                                                     }
                                                            else{
                                                                 if(y==11){
                                                                     gotoxy(x,y);
                                                                     printf("   ");
                                                                     y=13;
                                                                     gotoxy(x,y);
                                                                     printf(">>>");
                                                                     }
                                                                  else{
                                                                       if(y==13){
                                                                          gotoxy(x,y);
                                                                          printf("   ");
                                                                          y=15;
                                                                          gotoxy(x,y);
                                                                         printf(">>>");
                                                                         }
                                                                  else{
                                                                       if(y==15){
                                                                           gotoxy(x,y);
                                                                           printf("   ");
                                                                           y=17;
                                                                           gotoxy(x,y);
                                                                           printf(">>>");
                                                                                 }
                                                                      else{
                                                                           gotoxy(x,y);
                                                                           printf("   ");
                                                                           y=9;
                                                                           gotoxy(x,y);
                                                                           printf(">>>");
                                                                          }
     
                                                                       }
     
                                                                  }
                                                                 }
                                                         break;
                                                    }
                                         }
                     ch=getch();
                    }
      textbackground(0);
      textcolor(7);
      return(y);
    }
    gotoxy permet de placer mon curseur à l'endroit ou je veux dans ma fenetre.
    le 2eme getch permet de recuperer la valeur de la touche "fleche" étant donné qu'elle renvoie comme premier caractere 0 ou 224

    Merci d'avance, je galere depuis ce matin en faisant plein de test sans rien comprendre..

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    personne n'a d'idée ?

  3. #3
    Nouveau membre du Club Avatar de legend666
    Étudiant
    Inscrit en
    Mars 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2004
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Salut,

    Tu t'y prends extremement mal (et de manière extremement compliqué !) pour ce que tu veux faire !

    Ce que je pense que tu devrais faire pour faire un menu de ce genre:
    1)Demander d'appuyer sur une touche
    2)Tu lances ta boucle while(ch!=32) (32 est je suppose le code de la touche entré)
    2)Selon que ca soit haut ou bas tu augmentes ou tu diminue tes variables x et y QUELQUE SOIT l'actuel position de x et y (x += 2, x-=2, etc...).
    3)Quand l'utilisateur va presser entrer, on va sortir de la boucle et tu renvoie ton y
    Pas la peine de s'embeter avec tout ces if...else (d'ailleurs utilises if...else if...else plutot que des if...else imbriqués )


    Bonne continuation

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ciberju
    personne n'a d'idée ?
    Tu n'as mis aucune condition pour sortir. Tu devrais utiliser la valeur 13 (ASCII : CR) pour quitter. Sinon, c'est la boucle infinie. Aussi, il ne devrait y avoir qu'un seul getch() principal (+ 1 supplémentaire pour les codes étendus). On devrait pouvoir aussi abandonner (ESC : ASCII 27).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <conio2.h>
    #include <stdio.h>
     
    int menu ()
    {
       int ret = 0;
       int quitter = 0;
       do
       {
          int c = getch ();
     
          switch (c)
          {
          case 0:
             /* certains caracteres etendus */
             break;
          case 224:
             /* [Windows] d'autres caracteres etendus */
             break;
          case 27:
             /* abandon */
             quitter = 1;
             ret = -1;
             break;
          case 13:
             /* validation */
             quitter = 1;
             break;
          }
       }
       while (!quitter);
       return ret;
    }
     
    int main (void)
    {
       int choix = menu ();
       printf ("choix = %d\n", choix);
       return 0;
    }
    Voilà une meilleure base pour démarrer.

    Ensuite, on pourrait construire sur ce bases, une fonction qui prendrait en paramètres un tableau de chaines de caractères (char const **), terminé par NULL, et retournerait un nombre entre 1 et le nombre de chaines (ou -1 en cas d'abandon). Chaque chaine constituerait un élément de menu. Une paire de paramètres supplémentaires pourraient indiquer la position du coin supérieur gauche, voire demander un placement automatique (centré, gauche droite, haut, bas etc.)

    Le but serait, à partir de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       static char const *as_menu[] = 
       {
          "creer",
          "ajouter",
          "modifier",
          "supprimer",
          "enregistrer",
          NULL,
       }
       int ch = menu_vert (1, 1, as_menu);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     creer      
     ajouter 
     modifier
     supprimer
     enregistrer
    Le souligné signifie 'sélection' (en fait, inverse vidéo, que je ne peux simuler ici).

    On se déplace dans la liste avec les flèches Haut et Bas, et on valide avec enter (ou abandonne avec ESC).

    Vite fait sur le gaz...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    /*
       2008-12-25 : mises au normes C90
       2007-05-06 : version initiale
    */
    #include <conio2.h>
    #include <stdio.h>
    #include <string.h>
     
    #define DBG 1
     
    static int count (char const **as, size_t * p_len_max)
    {
       int n = 0;
       size_t len_max = 0;
       while (as[n] != NULL)
       {
    #if DBG
          printf ("p=%p\n", as[n]);
    #endif
          {
             size_t len = strlen (as[n]);
             if (len > len_max)
             {
                len_max = len;
             }
             n++;
          }
       }
       if (p_len_max != NULL)
       {
          *p_len_max = len_max;
       }
       return n;
    }
     
    static void display_nrm (int x, int y, char const **as, int sel,
                             size_t len_max)
    {
       gotoxy (x, y + sel);
       textbackground (CYAN);
       textcolor (BLACK);
       cprintf (" %-*s ", len_max, as[sel]);
    }
     
    static void display_sel (int x, int y, char const **as, int sel,
                             size_t len_max)
    {
       gotoxy (x, y + sel);
       textbackground (RED);
       textcolor (WHITE);
       cprintf (" %-*s ", len_max, as[sel]);
    }
     
    static void display (int x, int y, char const **as, int n, size_t len_max)
    {
       int i;
       for (i = 0; i < n; i++)
       {
          display_nrm (x, y, as, i, len_max);
       }
    }
     
    int menu_vert (int x, int y, char const **as)
    {
       int selection = 0;
       size_t len_max;
       int selection_max = count (as, &len_max);
       int quitter = 0;
     
    #if DBG
       printf ("selection_max=%d len_max=%d\n", selection_max, len_max);
    #endif
       {
          struct text_info ti;
          gettextinfo (&ti);
     
          display (x, y, as, selection_max, len_max);
     
          display_sel (x, y, as, selection, len_max);
     
          do
          {
             int c = getch ();
     
             switch (c)
             {
             case 0:
                /* certains caracteres etendus */
                break;
             case 224:
                /* [Windows] d'autres caracteres etendus */
                if (kbhit ())
                {
                   int cx = getch ();
                   switch (cx)
                   {
                   case 72:        /* UP */
                      display_nrm (x, y, as, selection, len_max);
                      if (selection > 0)
                      {
                         selection--;
                      }
                      else
                      {
                         selection = selection_max - 1;
                      }
                      display_sel (x, y, as, selection, len_max);
                      break;
     
                   case 80:        /* DOWN */
                      display_nrm (x, y, as, selection, len_max);
                      if (selection < selection_max - 1)
                      {
                         selection++;
                      }
                      else
                      {
                         selection = 0;
                      }
                      display_sel (x, y, as, selection, len_max);
                      break;
     
                   default:
    #if DBG
                      printf ("cx=%d\n", cx);
    #else
                      ;
    #endif
                   }
                }
                break;
     
             case 27:
                /* abandon */
                quitter = 1;
                selection = -1;
                break;
     
             case 13:
                /* validation */
                quitter = 1;
                break;
             }
          }
          while (!quitter);
          textattr (ti.normattr);
       }
       return selection + 1;
    }
     
    int main (void)
    {
       char const *as[] = {
          "creer",
          "modifier",
          "supprimmer",
          "quitter",
          NULL,
       };
     
       int choix = menu_vert (1, 1, as);
       printf ("choix = %d\n", choix);
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Probleme touche Windows
    Par Matou99 dans le forum Windows
    Réponses: 5
    Dernier message: 29/05/2018, 23h50
  2. Réponses: 2
    Dernier message: 29/08/2005, 18h29
  3. [udf] [windows 95] probleme d'UDF
    Par iguanevif dans le forum Débuter
    Réponses: 19
    Dernier message: 27/05/2004, 18h07
  4. Réponses: 13
    Dernier message: 07/04/2004, 14h25
  5. Probleme Touche F10
    Par ms91fr dans le forum Composants VCL
    Réponses: 3
    Dernier message: 15/01/2004, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo