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 :

Evènement OnKey : pas de touche "Return" ?!


Sujet :

wxWidgets

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut Evènement OnKey : pas de touche "Return" ?!
    Bonjour

    Mon petit problème, aujourd'hui se situe au niveau de l'évenementiel de wxWidget :
    J'ai associé ma fonction onkeydown à ma checkListBox, pour qu'elle repère mes commandes clavier. Toutes les touches sont reconnues... sauf la touche "Entrée". Bien sur, inutile de vous dire que c'est celle dont j'ai besoin.
    J'imagine que la touche Entrée provoque un autre évènement, mais je ne sais pas lequel ! (EVT_LIST_ITEM_ACTIVATED semblait approprié mais il appartient à wxListView, dont ne dépend pas ma wxCheckListBox...)

    Une idée ?

    Merci !

  2. #2
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Salut,
    Montre nous un bout de ton code d'où viens ton problème,
    As tu jeter un oeil au keycode ?? http://www.lpthe.jussieu.fr/~zeitlin....html#keycodes
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Ok, voici un bout de mon code, volontairement simplifié. La classe dialog est instanciée par un objet myframe que je ne décrirai pas ici.

    Le fichier myDialog.h
    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
    class myDialog : public wxDialog
    {
    private:
     
    	wxCheckListBox * TypeList;
     
    	wxCheckListBox * SubTypeList;
     
    public:
    	myDialog(wxWindow* parent, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
    	~myDialog();
     
    	// ***************************************
    	// void OnKeyDown(wxKeyEvent & event);
    	//
    	// Key event...
    	// ***************************************
    	void OnKeyDown(wxKeyEvent & event);
     
    };
    Le fichier myDialog.cpp
    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
    #include "myDialog.h"
     
    myDialog::myDialog(wxWindow* parent, const wxString& title, const wxPoint& pos, const wxSize& size)
    							:wxDialog(parent, -1, title, pos, size, wxSYSTEM_MENU)
    {
    	wxBoxSizer * theSizer = new wxBoxSizer( wxHORIZONTAL );
     
    	// Création de la première liste
    	TypeList = new wxCheckListBox(this, -1, wxPoint(-1,-1), wxSize(-1, -1) );
    	theSizer->Add(TypeList, wxALL);
    	TypeList->Connect(wxEVT_KEY_DOWN,(wxObjectEventFunction) &myDialog::OnKeyDown, NULL, this);
     
    	// Création de la deuxieme liste
    	SubTypeList = new wxCheckListBox(this, -1, wxPoint(-1,-1), wxSize(-1, -1) );
    	theSizer->Add(SubTypeList, wxALL);
    	SubTypeList->Connect(wxEVT_KEY_DOWN,(wxObjectEventFunction) &myDialog::OnKeyDown, NULL, this);
    }
     
    myDialog::~myDialog(){
     
    }
     
    void myDialog::OnKeyDown(wxKeyEvent & event){
    	wxMessageBox( wxString::Format("%d", event.GetKeyCode() ) );
    }
    J'avais déjà jeté un coup d'oeil au keycode, je pense que le problème est un peu plus compliqué.

    Merci

  4. #4
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Re salut,
    Alors je n'ai pas eu le temps de regarder en detaille ton bout de code, mais il est sur que l'evenement EVT_KEY_DOWN est valable pour TOUTES les touches du clavier.
    Va jeter un oeil dans les exemples fournis avec la librairie ( keyboard ) tu cela te confirmera ce que je viens de te dire.
    Donc ton problème viens d'autre part ...
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse, j'ai regardé l'exemple keyboard, mais ça ne m'a pas trop inspiré...

    En fait, j'ai déjà implémenté des évènements keyDown sur ma wxFrame : ça marche très bien!
    Les différences, dans notre cas, c'est que:
    1: j'associe mon évènement EVT_KEY_DOWN à une wxListBox, et non à une wxFrame. Or ça ne m'étonnerait pas que les wxListBox aient un évenement sur la validation (donc sur dblclick ou entrée). Lorsque j'appuie sur "entrée", le focus passe de la première liste à la deuxième.
    2: j'associe mon évènement avec la méthode Connect au lieu de faire une EVENT_TABLE.

    Selon ta théorie, tu penses que suite à l'appuie sur "Entrée", il y ait 2 évènements d'appelés : onKeyDown & onValidate ?

  6. #6
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Theoriquement il n'y a aucune différences entre la touche enter par rapport au autre touche!
    Tu associes ton évènement sur ta listBox pourquoi ne pas l'associer à ta frame?

    petite question est ce que cela marche lorsque tu appuis sur la touche "tab" ??
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Bien vu, la touche TAB non plus ne marche pas.
    En fait il y a 3 touches non détectées : TAB, Entrée, Entrée_numpad.

    Pourquoi n'ai je pas associé l'évenement à ma wxDialog ? Et bien j'ai essayé, au départ, mais ça n'a jamais marché ! J'ai l'impression que c'est parce que mes listBox (qui prennent l'intégralité de la dialog) gardent toujours le focus.
    Cependant, je suis d'accord que réussir à associer mon OnKey directement à la wxDialog me résoudrait tous mes pbs. Je devrais ptetre chercher de ce côté là...

  8. #8
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    ok alors lors de la construction de la listbox peux tu essayer de metre ce style : wxWANTS_CHARS

    Use this to indicate that the window wants to get all char/key events for all keys - even for keys like TAB or ENTER which are usually used for dialog navigation and which wouldn't be generated without this style. If you need to use this style in order to get the arrows or etc., but would still like to have normal keyboard navigation take place, you should create and send a wxNavigationKeyEvent in response to the key events for Tab and Shift-Tab.
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Ouais, en théorie, c'est exactement ça que je recherchait !

    ...mais ça ne change rien..

    Apparemment, sur un forum ils disent ça : http://lists.wxwidgets.org/archive/w.../msg03290.html
    Ce qui ne m'a toujours pas résolu mon pb.

    C'est dommage, parce que ça devrait marcher !

  10. #10
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeList->Connect(wxEVT_CHAR,(wxObjectEventFunction) &myDialog::OnKeyDown, NULL, this);
    Dans ta function onkeydown pour faire une action juste sur l'action de la touche enter met ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (event.GetKeyCode() == 13)
    .....
    si ca ne marche pas essais avec le style que je t'ai donné 2 messages plus haut
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Raaah, bien essayé, le EVT_CHAR mais.... raté.

    Déjà, est-ce que c'est normal que je n'arrive pas à associer mon évènement directement à ma wxDialog ? Si j'y arrivais, j'aurais plus ces problèmes !

    Mainenant, c'est bizarre que wxWidget ait prévu un wxWANTS_CHARS qui ne fonctionne pas...ne l'utilise-je pas correctement ? Ce n'est pourtant qu'un style de composant, théoriquement simple à mettre en place!

    Bo allez, j'y retourne.

  12. #12
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    EVT_CHAR marche je l'ai essayer chez moi! avec un wxTextCtrl
    ca devrait le faire avec une liste!
    envoi moi ton code fait un exemple minimal
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Voilà le code, on ne peut faire plus simple.
    myDialog.zip
    J'ai essayé sans wxWANTS_CHARS, avec wxWANTS_CHARS, avec EVT_KEY_DOWN, avec EVT_CHAR, en testant toues les combinaisons


    Pour ouvrir la myDialog, suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myDialog * dlg = new myDialog(this, "myDialog", wxPoint(-1, -1), wxSize(-1, -1));
    dlg->ShowModal();

  14. #14
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Rah c'est triste, y avait une bonne âme charitable qui voulait bien m'aider, et en plus elle était inspirée ! Pourquoi ne réponds-tu plus ?

  15. #15
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Salut,
    excuse moi pour ce petit temps d'attente !
    Alors j'ai essayé ton code! probleme : ce code marche tres bien chez moi et tout ce déroule comme prevu la touche entré tab ... son bien interpreté!
    sous quell environement es tu? quel est ta version de wx??
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  16. #16
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Ah, super, te revoilà !
    Mince, mauvaise nouvelle, ça marche chez toi.
    Je suis sous Windows XP, avec la version wxMSW-2.8.0 de wxWidget, si ça peut t'aider...

  17. #17
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Ok,
    je suis avec la 2.8.4 sous cygwin, essai de compilé avec cette derniere version ....
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  18. #18
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Apparemment, ils ont corrigé ce bug sous wxWidget 2.8.4 : mon 'return' est maintenant correctement détecté ! => Problème résolu.

    En tout cas merci beaucoup pour ton support, tu m'as bien aidé.
    Bises

    Martin

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

Discussions similaires

  1. ne peut pas simplement "aXSLProc.Process(aCursor);"
    Par didier.cabale dans le forum XMLRAD
    Réponses: 16
    Dernier message: 08/03/2006, 12h25

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