Les forums de JeuxVideo.com
-
lord_kalipsy
- Posté le
10 janvier 2005 à 05:04:46

-
Arf toujours trop court ce titre . ..
Ahem . ..
Alors b´jour
J´essais présentement de faire une simple application qui, quand on appuis sur un bouton, crée une autre fenêtre avec un bouton dans celle-ci un bouton pour fermer cette fenêtre ( la deuxième, pas le première
) . Bon comme je sens que j´en ai plusoeur j´vais faire euh . .. bah imaginé vous un dessin dans votre tête ( faute d´hébergeur pour une image . .. )
Fenêtre A ( WinMain, si on ferme cette fenêtre on quitte l´appli.): Possède un controle ( bouton pour créé la fenêtre B. Possède un autre bouton pour quitter l´application ( un genre de " QUIT" )
Fenêtre B : Possède un controle pour se fermer elle même.
( Sans quitter l´applivcation).
Je tiens à préciser que j´utilise pas de MDI ( peux importe ce que ça signifie ) ni de dialogs. De plus je code en ASM avec MASM32, mais si vous avez de la doc/exemples en C/C++ ça roule.
Je créer mes control ( bouton ) quand le message WM_CREATE est envoyé. ( Pour les fenêtres A et B )
Le problème c´est que quand je pèse sur le bouton " QUIT" -> Ça fonctionne mal, en fait je dois peser un nombre de fois équivalent au nombre de fois que j´appuis sur le bouton de la fenêtre B
Sinon quand je quitte en pesant sur la croix de la fenêtre A, le processus reste encore en fonction . ..
J´utilise deux fonction pour les messages ( une pour chaque fenêtre ) .
J´ai mis mon code sur le Wall ici : http://wall.cours-info.net/?id=323
Merci
Psy³
Ps : j´espère ne pas avoir été " trop vraiment pas clair"
- Lien permanent
-
dnob700
- Posté le
10 janvier 2005 à 18:01:04

-
bon, je ne lis pas couramment l´asm, mais je ne comprend pas ce que tu veux dire là :
" Le problème c´est que quand je pèse sur le bouton " QUIT" -> Ça fonctionne mal, en fait je dois peser un nombre de fois équivalent au nombre de fois que j´appuis sur le bouton de la fenêtre B "
que veut tu dire ? tu parle du boutons pour fermer tout l´application, tu doit appuyer dessus autant de fois que tu appuie sur le boutons pour créer une fenêtre B ?
ta fenêtre n´est pas modal ? je veux dire que quand la fenêtre B s´ouvre, tu peut toujours cliquer sur la fenêtre A sans que ça fasse Beep ?
dans ce cas là, j´ai peut-être une idée.
Quand u as plusieurs fenêtre, ej pense que le message de fin d´application ne doit être transmis qu´à une seule d´entre elle, si tu veux que tout ce ferme, il faut que le message soit trnasmis par ton code au autre fen^tre. je n´en suis pas sur mais je pense qu´il doit y avoir quelque chose comme ça.
est ce que dans AboutProc
tu ne devrai pas mettre un
. ELSEIF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
enfin, j´en sais rien, mais essaye toujours.
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 20:32:45

-
" ta fenêtre n´est pas modal ? je veux dire que quand la fenêtre B s´ouvre, tu peut toujours cliquer sur la fenêtre A sans que ça fasse Beep ? "
Non ça fait pas beep ^^
J´vais esseyé ce que tu m´as dit . .. le problème c´est que ma deuxième fenêtre ( la B ) est déjà fermé alors...
Juste pour être sûr : dans une appli avec plusieurs fenêtre, chacune d´entre elle à son propre WndProc hein ?
Merci de ton aide,
Psy³
Ps : si tu as une idée d´un endroit ou je pourrais trouver un exemple d´un prog du genre ( même en C/C++ ) pense à moi. ^^ ( J´ai déjà regardé sur codes-sources.com )
- Lien permanent
-
dnob700
- Posté le
10 janvier 2005 à 20:42:08

-
mais est ce que tu pourrait expliquer un tout petit peu plus précisemment le problème.
je veux dire, le nombre de fois que tu doit cliquer sur le bouton quitter de la fenêtre A est le nombre de fenêtre B ouverte ?
le problème est peut-être dans la boucle des mesasges : si elle s´arrète par ce qu´une fenêtre fait un postquitmessage et que l´autre n´a pas quitter, alors personne ne lui envoie de message.
sinon ya la méthode bourin : tu définit une variable globale ( je sais pas comment on fait en asm) à tout ton prog, et si elle elle est mise à 1 disont toute les fenêtre sorte de leurs boucle de messages ( tu le test au tout début du WndProc et du AboutProc et tu le mets lorsqu´une des fenêtre se quitte).
bon, je sais pas trop, j´émets des idées.
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 20:49:50

-
Hum attend je vien de remarquer quelque chose, j´dois cliqué 2 fois sur Quit ( fenêtre A ) deux fois, alors qu´avant c´était trois ( Hallucination ? ? )
Je tien à dire que le bouton ok de la fenêtre B ne fonctionne pas et que je dois fermer le fenêtre B avec la croix.
Psy³
- Lien permanent
-
dnob700
- Posté le
10 janvier 2005 à 20:58:57

-
pour le OK c´est normal, tune gère pas le WM_DESTROY, et je ne suis pas sur que le defwindowsproc puisse le faire.
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 21:00:27

-
" pour le OK c´est normal, tune gère pas le WM_DESTROY, et je ne suis pas sur que le defwindowsproc puisse le faire."
Ahhh, comment détruire une fenêtre sans killer le processus alors ?
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 21:29:59

-
Bon j´ai résolu le prob avec le ok ( j´envois un DestroyWindow)
Mais il me reste encore un problème : quand j´ouvre ma fenêtre B, si je quitte l´appli le processus reste en fonction ( même si j´ai quitté la fenêtre B avant )
- Lien permanent
-
Altonfrere
- Posté le
10 janvier 2005 à 21:45:37

-
j´arrive un peu tard mais pour la terminaison faut définir un test de fin pour ta boucle de message . ..
généralement sur le message WM_CLOSE ou WM_DESTROY on positionne à TRUE un booléen de fin d´application
genre :
g_bApplicationTerminee = FALSE;
while(!g_bApplicationTerminee)
{
/ / boucle de message ( Translate / Dispatch etc...)
}
et dans WNDPROC :
WM_DESTROY :
/ / . ..
g_bApplicationTerminee = TRUE;
/ / . ..
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 21:53:39

-
En fait, ça fonctionne pas seulement quand j´ai ouvert au moins une fois le AboutWindow ( fenêtre B)...
Altonfrere -> Pour ce qui est du invoke " ExitProcess,eax" je suis sur que ça sort toujours avec 0 donc je crois pas que ça vien de là. ( J´ai foutu des xor eax,eax un peu partout pour être sur ^^ )
Merci,
Psy³
- Lien permanent
-
Altonfrere
- Posté le
10 janvier 2005 à 21:55:13

-
ah oui dans ce cas ( un peu violent quand même) ca doit marcher le ExitProcess
si ya rien à libérer après la boucle de message . ..
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 21:57:39

-
Bah en ASM, t´es obligé de faire le ExitProcess toi même ( en sortant de WinMain en C/C++, je crois que c´est automatique, alors qu´en ASM ce l´est pas)
Mais même à ça le processus reste en fonction . .. hum . ..
Psy³
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 21:59:08

-
( Notes que le ExitProcess est après la boucle du Window principal . .. hum )
- Lien permanent
-
Altonfrere
- Posté le
10 janvier 2005 à 22:00:28

-
ah j´ai pas fais attention . .. mais tu es sur que tu sors de la boucle principale ?
- Lien permanent
-
Altonfrere
- Posté le
10 janvier 2005 à 22:02:08

-
j´ai vu que tu sortais sur le GetMessage . ..
dans la doc :
If the function retrieves a message other than WM_QUIT, the return value is nonzero.
If the function retrieves the WM_QUIT message, the return value is zero.
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 22:02:36

-
Arf, c´est ça le prob je pense . .. si seulement RadASM avec un débugueur intégré . .. bon j´vais revoir mon code....
- Lien permanent
-
lord_kalipsy
- Posté le
10 janvier 2005 à 22:05:41

-
Roooooh j´ai toruvé ! Ça fonctionne ! Il faut mettre un invoke PostQuitMessage,NULL pour chaque fenêtre ! Moi je pensais que c´était seulement à la fene^tre principale . .. ahhh
Merci de votre aide
- Lien permanent
-
dnob700
- Posté le
10 janvier 2005 à 22:22:00

-
de rien ( finalement c´était la première idée qui était la bonne).
- Lien permanent
Sujet : « (Win32/C)Problème multi-fenêtres »