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.\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.
Hors ligne
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\n"); if (msg.message == WM_DESTROY) printf("WM_DESTROY intercepte\n"); }
Hors ligne
franchement tu t'embête, et en plus ce n'est pas portable tu pourais simplement faire un truc dans le genre:
Hors ligne
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)
Hors ligne
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
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.
Hors ligne
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.
Hors ligne