Bonjour à tous,
Je rencontre actuellement un problème avec l'utilisation d'une editbox. Il s'avère que dans mon capteur d'events je traite plusieurs choses dans l'ordre :
gui
SOURIS
CLAVIER
->Traitement des touches P,M,L
Dans mon programme, en cliquant sur un bouton, cela ouvre une sous-fenêtre contenant la fameause editbox. Je me suis rendu compte que si l'on appuie sur l'une de ces trois touches (P,M,L) l'event n'est pas détecté comme étant un gui Event, mais comme un Keyboard event. Je vous mets un code minimal pour mieux illustrer tout ça :
if (event.EventType == EET_GUI_EVENT) { s32 id = event.GUIEvent.Caller->getID(); switch(event.GUIEvent.EventType) { case gui::EGET_BUTTON_CLICKED: { switch(id) { case BOUTON_QUITTER : device->closeDevice(); return true; break; case BOUTON_SAUVER : { gui::IGUIWindow* fenetre_save = env->addWindow(core::rect<s32>(300,300,600,500),false,L"Sauvegarder",0,FENETRE_SAUVER); wstring txt(L""); gui::IGUIEditBox* textBox = env->addEditBox(txt.c_str(),core::rect<s32>(10,160,290,190),true,fenetre_save,EDITBOX_NOM_SAVE); env->setFocus(textBox); fenetreLoaded = true; return true; } break; default: break; } } break; case gui::EGET_EDITBOX_CHANGED: { return true; } break; default: break; } } else if(event.EventType == EET_MOUSE_INPUT_EVENT) { //Peu importe } else if(event.EventType == EET_KEY_INPUT_EVENT) { switch(event.KeyInput.Key) { case KEY_KEY_P: { cout<<"P"<<endl; } break; case KEY_KEY_M: { cout<<"M"<<endl; } break; case KEY_KEY_L: { cout<<"L"<<endl; } break; default: break; } } return false;
Est ce un problème classique ? Si oui, j'aimerais bien comprendre car ça va vraiment à l'encontre de toute logique, et de tout ce que je sais de irrlicht. Merci d'avance ;)
Hors ligne
La détection de touches, c'est toujours du Keyboard event.
Normalement, le code que tu as donné doit fonctionner correctement. Irrlicht ne fait pas la différence entre une touche appuyé et une touche appuyé avec une fenêtre sélectionné (pour lui c'est une touche appuyé).
Hors ligne
Oui mais du coup comment faire pour empêcher cela ? Je veux dire, comment, lorsque l'editbox est active, lui restreindre les évenements, et ainsi empecher qu'ils soient traités après dans mon event receiver ? J'ai essayé de faire renvoyer faux au tout début de mon event receiver en utilisant la methode hasFocus() de l'editbox mais ça ne marche pas. J'espère que vous comprenez mon problème.
Merci d'avance.
Hors ligne
Ok, j'ai compris, et trouvé une solution :
Je me sert de l’évènement focused et focus_lost pour gérer le focus.
virtual bool OnEvent(const SEvent& event) { //test sur la gui if(event.EventType==EET_GUI_EVENT) { //Ce test va s'appliquer à tout les éléments de la gui. //Faire un autre test sur l'editbox si c'est le seul élément qui doit bloquer les touches du clavier if(event.GUIEvent.EventType==EGET_ELEMENT_FOCUSED) { //variable à déclarer dans la classe focus=true; } if(event.GUIEvent.EventType==EGET_ELEMENT_FOCUS_LOST) { focus=false; } } //test sur les touches if(event.EventType==EET_KEY_INPUT_EVENT) { //gérer les touches si la gui na pas le focus if(!focus) { if(event.KeyInput.Key==KEY_KEY_A && event.KeyInput.PressedDown) { std::cout<<"toucheA"<<std::endl; return true; } } } return false; }
Dernière modification par thesus (17-02-2011 20:12:34)
Hors ligne
Merci de ta réponse, je viens de trouver une solution moi aussi :
Rajouter ça au début de l'event receiver :
if(env->hasFocus(env->getRootGUIElement()->getElementFromId(EDITBOX_NOM_SAVE,true))) { return false;//Never executed }
EDITBIX_NOM_SAVE étant un élément d'une énumération, et qui représente l'id de l'edit Box.
Hors ligne