#0 

06-07-2012 14:53:03

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Je poste ici car les posts de la section gui n'apparaissent pas dans la file "Dernières discussions sur les forums".
Sinon j'avais posté là : autre post.

Je souhaite récupérer l'événement "WM_CLOSE" avant Irrlicht car il y a une action que je dois absolument effectuer avant que closeDevice() soit appelée.
J'ai essayé de mettre ça dans la boucle de rendu, mais ça bloque tout les événements fenêtre :

Code:

#ifdef _DEBUG
 if(mHandle)
{
      /// interception du message de fermeture
      MSG msg;
       GetMessage(&msg, mHandle, 0, 0);
       if( msg.message == WM_CLOSE )
        {
             printf("Message WM_CLOSE intercepte.\n");
             beforeCloseDevice();
             mDevice->closeDevice();
            }
        }
#endif

msg.message prend bien des valeurs au fur et à mesure de l'éxécution mais je ne peux pas bouger ou redimensionner ma fenêtre ET PIRE, je ne peux pas non plus fermer la fenêtre avec la croix (bouton close).
Si quelqu'un a une idée parce que je retourne msdn mais je ne trouve pas d'autres pistes que celle que j'ai cité au-dessus.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#1 

06-07-2012 15:57:31

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

J'ai aussi essayé de mettre ça dans la boucle espérant intercepter un message mais ça ne donne rien, l'application marche comme si je n'avais rien fait.

Code:

        MSG msg;
        if( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
        {
            if (msg.message == WM_QUIT)
                printf("WM_QUIT intercepte\n");
            if (msg.message == WM_DESTROY)
                printf("WM_DESTROY intercepte\n");
        }

core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

12-07-2012 10:35:24

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

franchement tu t'embête, et en plus ce n'est pas portable tu pourais simplement faire un truc dans le genre:

Code c++ :


while(1)
{
            if(!device->run())
           {           
                      //ton code
                      break;
           }
            driver->beginScene(true, true, irr::video::SColor(255,25,25,25));
                smgr->drawAll();
                guienv->drawAll();
            driver->endScene();
}

Hors ligne


#3 

12-07-2012 15:35:02

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Justement, je ne peux pas car à partir du moment où device->run() retourne false, GetWindowPlacement(handle, &lpwndpl) ne peut plus obtenir la position de la fenêtre (GetWindowPlacement retourne false).

En fait, j'ai regardé dans les sources et voilà comment il procède :
- Appuie sur le bouton close;
- réponse à WM_DESTROY par PostQuitMessage;
- Si WM_QUIT est dans la file,  device->run() retourne false;

Je pense qu'il faudrait que je sauvegarde la position de la fenêtre avant que PostQuitMessage soit appelé pour que ça marche. Mais sans toucher aux sources ça me semble infaisable.

Dernière modification par johnplayer (12-07-2012 15:40:24)


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

13-07-2012 03:30:15

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

sa me parait bizard étant donner que la fenêtre est encore "active"
donc théoriquement en passent par le Hwnd et GetClientRect, ça doit marcher

normalement, si mais souvenir sont bon, les donner sont libéré seulement avec la destructions du device qui ne ce produit, qu'a la fin du main où device->drop();
et donc rien n'empeche cette operation

ba sinon sans devoire recoder une parti de l'engine, tu peut toujours enregistrer la position de la fenetre dans un elapsedtime (~75ms), c'est pas vraiment gourmand, c'est pas franchement très propre j'avoue, mais en attendant mieux, où alors capter l'event de changement de position

ps: je parle un petit peut dans le vide, j'ai une saint horreur de windob, donc linux powa
dans un dernier recoure, je peut potentielement booter sous windows, et faire des teste si tu le souhaite

Hors ligne


#5 

13-07-2012 09:56:34

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

C'est ce que je fais actuellement (toutes les 60 000ms) mais comme tu le dis c'est pas très propre. Par contre, je n'avais même pas pensé à capter l'événement de changement de position.
Pour ce qui est de la fenetre lorsque device->run() retourne false elle est déjà détruite. J'ai mis un sleep(5000) après la boucle de rendu ( et donc avant device->drop() ) et la fenêtre s'est fermée avant d'attendre les 5 secondes. Donc c'est pour cette raison que GetWindowPlacement (j'ai aussi essayé getwindowrect au cas où) ne fonctionnent pas.

Je vais essayer de capter l'événement comme tu l'as évoqué et si tu peux faire des essais de ton côté se serait sympa.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#6 

13-07-2012 10:30:12

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

J'ai essayé avec plein de messages différents mais pas moyen. Cela mon code marche puisque j'ai réussi à intercepter certains messages comme WM_MOUSEMOVE. Mais WM_WINDOWPOSCHANGED et WM_WINDOWPOSCHANGING ne sont jamais interceptés. Je t'avouerais que je ne sais pas quoi faire mis à part l'enregistrement à intervalle comme je fais présentement.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

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
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
37 invités en ligne
Aucun membre connecté
RSS Feed