#1 

16-02-2011 15:06:50

overdrivr
Membres
Date d'inscription:
Messages: 4
IP: 134.60.220.188
Courriel

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 wink


Hors ligne


#2 

16-02-2011 19:22:06

thesus
Membres
Avatar de thesus
Date d'inscription:
Messages: 19
IP: 90.58.133.238
Courriel

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


#3 

16-02-2011 23:31:55

overdrivr
Membres
Date d'inscription:
Messages: 4
IP: 134.60.220.188
Courriel

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


#4 

17-02-2011 19:11:13

thesus
Membres
Avatar de thesus
Date d'inscription:
Messages: 19
IP: 90.58.130.218
Courriel

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;
}


Hors ligne


#5 

19-02-2011 15:58:12

overdrivr
Membres
Date d'inscription:
Messages: 4
IP: 134.60.220.188
Courriel

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


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
117 invités en ligne
membre en ligne: -
RSS Feed