Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bug pour la fermeture de fenêtre

6 réponses
Avatar
Rowing duck
Bonjour,
(Ce message est différent de celui de ByB)
Je débute en programmation Win API (en C évidement) et je cale sur un petit
problème :
mon programme ouvre d'abord une fenêtre principale, puis à l'aide de bouton
et de WM_COMMAND ouvre une fenêtre enfant (la fenêtre parent ne réagit plus)
puis lorsque le programme en a fini avec la fenêtre, il la ferme de cette
façon :

LRESULT CALLBACK procedure_fentre_enfant(patati)
{
//patati
case WM_DESTROY:
{
SendMessage(hwnd_fenetre_enfant , WM_DESTROY, 0, 0);
return 0;
}

//patata
}

(cette portion de code correspond a peu près à la réalité, il peut y avoir
des fautes, mais en tout cas, dans le vrai code, il n'y en a aucune pendant
la génération)

Alors voilà le bug : la fenêtre enfant disparait bel et bien mais la fenêtre
parent reste définitivement bloquée...
Merci d'avance

6 réponses

Avatar
Alain
Rowing duck wrote:
Bonjour,
...



LRESULT CALLBACK procedure_fentre_enfant(patati)
{
//patati
case WM_DESTROY:
{
SendMessage(hwnd_fenetre_enfant , WM_DESTROY, 0, 0);
return 0;
}

//patata
}

(cette portion de code correspond a peu près à la réalité, il peut y
avoir des fautes, mais en tout cas, dans le vrai code, il n'y en a
aucune pendant la génération)

Alors voilà le bug : la fenêtre enfant disparait bel et bien mais la
fenêtre parent reste définitivement bloquée...




Il faut appeler PostQuitMessage(0); sur WM_DESTROY et ne pas envoyer
WM_DESTROY mais WM_CLOSE
Inspire-toi du code du Wizard Win32 de Visual Studio...
Avatar
Rowing duck
Merci de ta réponse
case WM_DESTROY:
{
SendMessage(hwnd_fenetre_enfant , WM_DESTROY, 0, 0);
return 0;
}





Il faut appeler PostQuitMessage(0); sur WM_DESTROY et ne pas envoyer
WM_DESTROY mais WM_CLOSE
Inspire-toi du code du Wizard Win32 de Visual Studio...



J'ai donc modifié le code
case WM_DESTROY:
{
PostQuitMessage(0);
SendMessage(hwnd_fenetre_enfant , WM_CLOSE, 0, 0);
return 0;
}

Et ça ne marche toujours pas, même en essayant des tas de combinaisons
trouvées sur MSND et le code de départ sur Visual Studio...
Je pense que le problème vient du focus qui ne reviens pas totalement sur la
fenêtre principale ou alors du CALLBACK : faut-il en avoir UN SEUL dans tous
le programme ?
Question subsidiaire : je n'arrive pas à masquer la fenêtre de la console,
comment faire ?

Cordialement, DG
Avatar
antoine
"Rowing duck" wrote in message
news:gh92e7$a5e$

Et ça ne marche toujours pas, même en essayant des tas de combinaisons
trouvées sur MSND et le code de départ sur Visual Studio...
Je pense que le problème vient du focus qui ne reviens pas totalement sur
la fenêtre principale ou alors du CALLBACK : faut-il en avoir UN SEUL dans
tous le programme ?
Question subsidiaire : je n'arrive pas à masquer la fenêtre de la console,
comment faire ?



La console ?!
Il n'y a pas de console en mode win32 ..
Car le code du wizard win32, il marche tout seul et fait la même chose, à
part que c'est une dialog box qui est utilisée. Tu es sûr que tu pars de là
?
Tu devrais poster la totalité de ton code car c'est indebuggable par
morceaux sinon...
Avatar
Vincent Burel
"Rowing duck" wrote in message
news:gh92e7$a5e$
Merci de ta réponse
>> case WM_DESTROY:
>> {
>> SendMessage(hwnd_fenetre_enfant , WM_DESTROY, 0, 0);
>> return 0;
>> }



il vaut mieux appeler WM_CLOSE pour fermer une fenêtre.

> Il faut appeler PostQuitMessage(0); sur WM_DESTROY et ne pas envoyer
> WM_DESTROY mais WM_CLOSE
> Inspire-toi du code du Wizard Win32 de Visual Studio...



J'ai donc modifié le code
case WM_DESTROY:
{
PostQuitMessage(0);
SendMessage(hwnd_fenetre_enfant , WM_CLOSE, 0, 0);
return 0;
}



Le but du PostQuitMessage(0) est de casser la boucle de message. Donc ca n'a
pas beaucoup de sens de faire un SendMessage après.

Question subsidiaire : je n'arrive pas à masquer la fenêtre de la console,
comment faire ?



bizarre ! vous faite un soft en mode console ?
Avatar
Rowing duck
Bonjour,
Je m'excuse de ne pas avoir répondu plus vite...

bizarre ! vous faite un soft en mode console ?



Eh non justement, le programme est censé tourner seulement avec les fenêtres
Cependant, je n'utilise pas Visual mais Code::Blocks, cela dit j'ai quand
même la version Visual Express sur mon PC.

Le but du PostQuitMessage(0) est de casser la boucle de message. Donc ca
n'a
pas beaucoup de sens de faire un SendMessage après.



je pense que dans mes nombreuses tentatives infructueuses, j'ai du bien
échanger les deux lignes et ça n'a rien donné

J'ai vu que les fichiers générés au départ étaient en .cpp alors que je
programme en C, j'ai donc recrée un fichier main "maison" en .c : le
problème vient peut-être de là...

Une autre question (et oui je suis curieux ; ) ) peut-on utiliser plusieurs
librairies dans le même programme (utiliser par exemple win32 api avec
Direct X) ?

J'envoie les extraits de code très prochainement
Avatar
jean
"Rowing duck" wrote in message
news:ghmiri$2ke$
..
Une autre question (et oui je suis curieux ; ) ) peut-on utiliser
plusieurs librairies dans le même programme (utiliser par exemple win32
api avec Direct X) ?



L'api win32 n'est pas une librairie, elle fait partie intégrante de l'OS.