#0 

16-02-2011 16:06:50

overdrivr
Petit nouveau
Date d'inscription: 23-11-2008
Messages: 4

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 :

Code:

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


#1 

16-02-2011 20:22:06

thesus
Membre
Date d'inscription: 11-08-2009
Messages: 19
Corrections: 1

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


#2 

17-02-2011 00:31:55

overdrivr
Petit nouveau
Date d'inscription: 23-11-2008
Messages: 4

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


#3 

17-02-2011 20:11:13

thesus
Membre
Date d'inscription: 11-08-2009
Messages: 19
Corrections: 1

Ok, j'ai compris, et trouvé une solution :

Je me sert de l’évènement focused et focus_lost pour gérer le focus.

Code:

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


#4 

19-02-2011 16:58:12

overdrivr
Petit nouveau
Date d'inscription: 23-11-2008
Messages: 4

Merci de ta réponse, je viens de trouver une solution moi aussi :

Rajouter ça au début de l'event receiver :

Code:

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é
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
83 invités en ligne
Aucun membre connecté
RSS Feed