Les fonctions marchent, seulement voilà comment ca se passe : le client veut enregistrer avant de quitter (admettons...), il clique sur "oui" dans la MessageBox(); qui est alors censé envoyer un message à IDM_SAVE, mais au lieu de cela, le compilateur exécute déjà les instructions à la suite dans WM_CLOSE, soit DestroyWindow()... puis elle envoie un message à IDM_SAVE.
Donc ca va pas quoi. Comment je peux interverdire cet ordre ?
olbal
Messages postés20Date d'inscriptionvendredi 16 mai 2003StatutMembreDernière intervention29 septembre 2006 17 févr. 2006 à 13:50
Il faudrait voir le code de traitement du message IDM_SAVE car SendMessage ne se termine qu'a la fin du traitement du message contrairement à PostMessage donc pas de problème. Si le code gérant IDM_SAVE lance la sauvegarde dans un autre thread, c'est sur par contre que ça doit aller au crash si t'attends pas la fin du thread...
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 17 févr. 2006 à 13:51
Si j'ai bien compris ce que tu veux, devrait aller ainsi:
case WM_CLOSE:
if(nbDroite>0 && bModified) {
switch(MessageBox(hwnd, "Voulez-vous enregistrer les modifications ?",
"Enregistrer ?", MB_YESNOCANCEL | MB_ICONQUESTION)) {
case IDYES:
// APPEL TA FONCTION ENREGISTREMENT ICI
// ET ON LAISSE ALLER DESSOUS, PAS DE BREAK
case IDNO:
goto goDESTROY;
}
return 0;
}
goDESTROY:
DestroyWindow(hwnd);
return 0;
julien_boss
Messages postés165Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention24 octobre 2007 17 févr. 2006 à 14:07
En effet olbal, dans IDM_SAVE, il y a un autre SendMessage, à IDM_SAVEAS (si le client n'a pas déjà sauvegardé).
Donc en fait ca marche seulement si l'utilisateur avait sauvegardé avant, sinon nan.
BruNews ca me fait un peu chier d'écrire ma fonction qui demande d'enregistrer ou non ici, vu que je l'utilise plusieurs fois dans le programme
julien_boss
Messages postés165Date d'inscriptionsamedi 4 juin 2005StatutMembreDernière intervention24 octobre 2007 17 févr. 2006 à 14:27
ca ne marche pas plus en faite. J'ai mieux ciblé le problème : dans IDM_SAVE, on envoie un mess à IDM_SAVEAS si on a pas enregistrer au préalable. Or le compilateur, on y revient, exécute d'abord DestroyWindow() avant d'aller voir IDM_SAVEAS