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

wxWidgets Discussion :

évènement clavier


Sujet :

wxWidgets

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut évènement clavier
    Hello.

    J'ai créer une classe myFrame qui est dérivée de wxFrame.
    Dans le constructeur de myFrame j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    done=false;
    while(!done)
    {
      //.......
    }
    Et j'aimerais bien mettre "done" à true quand l'utilisateur appuis sur la touche "echap".

    Je pense qu'il y a tout à fait moyen de faire ceci en créant une thread pour la gestion des évènements du clavier.
    Mais y a-t-il moyen de le faire sans thread....ça compliquerais en peu moins le programme ?

    Merci...

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si c'est une boucle de jeu (au pif), la meilleure stratégie sera plutôt de mettre à jour l'affichage dans les évènements TIMER (fréquence fixée par toi) et PAINT, plutôt que de mettre une boucle infinie dans ton constructeur.

    Créer un thread ne t'apportera que des problèmes.

    Si au contraire ce n'est pas ça, tu peux détailler un peu ce que tu veux faire ?

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Je pense qu'il y a tout à fait moyen de faire ceci en créant une thread pour la gestion des évènements du clavier.
    Mais y a-t-il moyen de le faire sans thread....ça compliquerais en peu moins le programme ?
    En fait, il faut que tu crées une table d'évenement pour ta frame avec un evenement clavier.

    Ca se passe en gros comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN_EVENT_TABLE(MyFrame, wxFrame)
        EVT_KEY_DOWN(MyFrame::KeyboardFunc)  
    END_EVENT_TABLE()
    La fonction KeybordFunc ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MyFrame::KeyboardFunc( wxKeyEvent event )
    {
        if( event.GetModifiers() == wxMOD_META )
        {
             /* Traitement */ 
        }
    }
    Tu peux aussi utiliser la commande suivante dans ton if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( MetaDown() )
    {
         /* traitement */
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    done=false;
    while(!done)
    {
      //.......
    }
    Evite les boucles dont tu ne contrôles pas le nombre d'itération dans un constructeur.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Merci pour vos 2 réponses mais:

    En fait la boucle n'est pas dans le constructeur mais dans une fonction membre....ça change quelque chose pour vous ?
    PRomu@ld pourquoi tu me dit ceci : "Evite les boucles dont tu ne contrôles pas le nombre d'itération dans un constructeur." ?

    J'explique mon problème en gros : J'ai donc fait un cube en opengl qui tourne sur lui même à l'inifini. Et j'aimerais bien arrêter de le faire tourner quand j'appuie sur la touche "Echap".

    Laurent Gomila est-ce que tu pourrait réexpliqué en peu plus en détail ta solution si elle convient à mon problème parce que je n'ait pas bien compris.

    J'ai donc fait un code très similaire à celui de PRomu@ld:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN_EVENT_TABLE(myFrame, wxFrame)
    	EVT_KEY_DOWN(myFrame::onKey)
    END_EVENT_TABLE()
    .....
    void myFrameMain::onKey(wxKeyEvent &event)
    {
    	if(event.GetKeyCode()==WXK_ESCAPE)
    	{
    		done=true;
    	}
    }
    Le problème c'est que le programme ne passe jamais dans la fonction onKey parce qu'il est occupé par la boucle "while(!done)". Y a-t-il moyen de résoudre se problème sans utiliser les thread ?

    Merci d'avance...

    Edit: http://nehe.gamedev.net/data/lessons....asp?lesson=01 vers les 4/5 de la page, il a une boucle "while(!done)" et en peu plus bas, il vérifie à chaque tour de boucle si l'utilisateur à appuyer sur "echap". Comment faire ça avec wxWidgets ?

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Avec wxwidgets pas besoin car les évènements, ben la lib la gère toute seule.
    Donc tu n'as qu'à faire :
    Dès qu'on détecte telle touche appuyée, on ferme l'application.
    Oui oui, wxWidgets permet ça

    PS : pour opengl/(glut? ou autre) c'est pas pareil, on a pas une fenêtre qui demeure, et des évènements qui sont "décochés". Il faut faire une boucle infinie et tout gérer dedans. Ici pas besoin car la lib gère tout ça sans nous en toucher un mot.

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    PRomu@ld pourquoi tu me dit ceci : "Evite les boucles dont tu ne contrôles pas le nombre d'itération dans un constructeur." ?
    Ben en fait, tu peux bloquer toute ton application comme ça.

    Le problème c'est que le programme ne passe jamais dans la fonction onKey parce qu'il est occupé par la boucle "while(!done)". Y a-t-il moyen de résoudre se problème sans utiliser les thread ?
    Perso, je serait passé par une fonction d'arrière plan (IDLE) pour mettre à jour la nouvelle coordonnée.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    En es-tu vraiment sur Alp ? :

    J'ai fait une code simplifié pour simplifier mon problème

    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
    #include "main.h"
     
    myFrameMain::myFrameMain() : wxFrame(NULL, -1, "Titre", wxPoint(-1, -1), wxSize(1024,790), wxDEFAULT_FRAME_STYLE)
    {
    	done=false;
    	this->Show(true);
    	while(!done)
    	{
    		Sleep(500);
    	}
     
    }
     
    void myFrameMain::onKey(wxKeyEvent &event)
    {
    	wxLogMessage("onKey executé");
    	done=true;
    }
     
    BEGIN_EVENT_TABLE(myFrameMain, wxFrame)
    	EVT_KEY_DOWN(myFrameMain::onKey)
    END_EVENT_TABLE()
     
    IMPLEMENT_APP(Ini);
    bool Ini::OnInit()
    {
    	myFrameMain *frame = new myFrameMain();
    	frame->Show(TRUE);
     
    	return true;
    }
    La boucle ne s'arrête jamais même si j'appuie sur une touche...et le programme ne rentre jamais dans la fonction "onKey".

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    "Perso, je serait passé par une fonction d'arrière plan (IDLE) pour mettre à jour la nouvelle coordonnée."

    Heu...qu'est ce que c'est une fonction d'arrière plan ? Comment faire pour en créer une et comment est-ce que ça fonctionne ? (Différament des threads ?)

  9. #9
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Première question : est-ce que tu utilises ce qu'il faut pour combiner OpenGL et wxWidgets ?
    http://jeux.developpez.com/faq/openg...LIBS_wxwidgets

    Ensuite, il te suffit d'avoir un booléen que tu passes à false lors de l'appui sur la touche echap, et qui contrôle la rotation du cube.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Laurent Gomila => Oui...j'ai d'ailleur utilisé se tutorial pour y arriver

    "Ensuite, il te suffit d'avoir un booléen que tu passes à false lors de l'appui sur la touche echap, et qui contrôle la rotation du cube." ==> plus facile à dire qu'a faire...c'est ce que j'esseye de faire avec mon code source 4 postes plus haut mais ça ne fonctionne pas.

    Bon je vais voir ce que je peux faire avec wxIdleEvent mais c'est pas facile quand on est aussi null que moi en anglais

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    plus facile à dire qu'a faire
    Ben c'est ce que fait ton code 4 posts plus haut, il n'y a pas à chercher plus compliqué.

    Le booléen qui contrôle la rotation est ta variable done, qui sera bien à true lorsque tu auras appuyé sur echap, et ensuite il suffit de virer cette boucle de ton constructeur (ou peu importe l'endroit où elle se trouve).

    Dans ton updateGL (ou paintGL, ou que sais-je), à l'endroit où tu effectues la rotation, tu ajoutes simplement un test sur la variable done :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!done)
        glRotatef(...);
    Bon je vais voir ce que je peux faire avec wxIdleEvent mais c'est pas facile quand on est aussi null que moi en anglais
    Normalement lorsque tu travailles avec un QGLWidget, tu n'as qu'à redéfinir les 2 ou 3 fonctions virtuelles qu'il te fournit, c'est lui qui gère la boucle d'affichage et la fréquence de rafraîchissement. Tu ne dois normalement pas gérer toi-même de boucle ou d'évènement périodique.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Mon code plus haut ne fonctionne pas !
    Donc mon but : esseyer de le faire fonctionner...

    done ne passe jamais à true quand j'appuie sur une touche !

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu as viré la boucle ?

    Autre chose :

    J'ai créer une classe myFrame qui est dérivée de wxFrame
    Tu n'utilises pas QGLWidget ? Tu dis que oui, mais pour l'instant tout dans ton code indique le contraire.

  15. #15
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut


    On parlait pas de wxWidgets ?

    Mon code plus haut ne fonctionne pas !
    Si tu l'a mis dans ton constructeur, pour moi, c'est normal ! As tu essayé avec une "IdleFunc" ?

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut


    J'étais parti sur Qt, je ne sais pas pourquoi, désolé.

    Du coup effectivement il faut bien appeler le draw sur un évènement OnIdle.

    Mais bon tout ça est dans l'exemple donné sur le wiki wxWidgets, dont le lien est dans la FAQ OpenGL.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Si tu l'a mis dans ton constructeur, pour moi, c'est normal ! As tu essayé avec une "IdleFunc" ? ==> non pas encore...je vais fouiller tout google pour en apprendre en peu plus sur les "idlefunc" et "wxIdleEvent" et je vous redit quoi.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Voila j'ai suis arrivé grâce à wxIdleEvent même si je n'ait pas encore tout compris.

    Merci à vous tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Turbo Pascal] Entrée au clavier sous forme ******
    Par Upal dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 15/02/2003, 14h42
  2. [TP]vider le tampon clavier
    Par kael kael dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 11/01/2003, 22h19
  3. Clavier Azerty
    Par Smortex dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 16/12/2002, 20h33
  4. Cherche Nom des touches du clavier
    Par juan64 dans le forum C++Builder
    Réponses: 8
    Dernier message: 23/07/2002, 19h11
  5. Vider le buffer du clavier
    Par flavien tetart dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 12/07/2002, 08h35

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