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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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".

+ 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