06-07-2012 12:53:03
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.192.220.69
- Courriel
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 :
#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.\
");
beforeCloseDevice();
mDevice->closeDevice();
}
}
#endifmsg.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
06-07-2012 13:57:31
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.192.220.69
- Courriel
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.
MSG msg;
if( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
{
if (msg.message == WM_QUIT)
printf("WM_QUIT intercepte\
");
if (msg.message == WM_DESTROY)
printf("WM_DESTROY intercepte\
");
}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
12-07-2012 08:35:24
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 90.5.173.150
- Courriel 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
12-07-2012 13:35:02
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.229.216
- Courriel
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.
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
13-07-2012 01:30:15
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 90.5.173.150
- Courriel 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
13-07-2012 07:56:34
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.229.216
- Courriel
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
13-07-2012 08:30:12
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.229.216
- Courriel
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



