Fermeture de la fenêtre
Lorsque l’utilisateur ferme une fenêtre, cette action déclenche une séquence de messages de fenêtre.
L’utilisateur peut fermer une fenêtre d’application en cliquant sur le bouton Fermer ou en utilisant un raccourci clavier tel que ALT+F4. L’une de ces actions entraîne la réception d’un message WM_CLOSE la fenêtre. Le message WM_CLOSE vous permet d’inviter l’utilisateur avant de fermer la fenêtre. Si vous souhaitez vraiment fermer la fenêtre, appelez la fonction DestroyWindow . Sinon, retournez simplement zéro à partir du message WM_CLOSE , et le système d’exploitation ignore le message et ne détruit pas la fenêtre.
Voici un exemple de la façon dont un programme peut gérer WM_CLOSE.
case WM_CLOSE:
if (MessageBox(hwnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK)
{
DestroyWindow(hwnd);
}
// Else: User canceled. Do nothing.
return 0;
Dans cet exemple, la fonction MessageBox affiche une boîte de dialogue modale qui contient les boutons OK et Annuler . Si l’utilisateur clique sur OK, le programme appelle DestroyWindow. Sinon, si l’utilisateur clique sur Annuler, l’appel à DestroyWindow est ignoré et la fenêtre reste ouverte. Dans les deux cas, retournez zéro pour indiquer que vous avez géré le message.
Si vous souhaitez fermer la fenêtre sans inviter l’utilisateur, vous pouvez simplement appeler DestroyWindow sans appeler MessageBox. Toutefois, il existe un raccourci dans ce cas. Rappelez-vous que DefWindowProc exécute l’action par défaut pour tout message de fenêtre. Dans le cas de WM_CLOSE, DefWindowProc appelle automatiquement DestroyWindow. Cela signifie que si vous ignorez le message WM_CLOSE dans votre instruction switch , la fenêtre est détruite par défaut.
Lorsqu’une fenêtre est sur le point d’être détruite, elle reçoit un message WM_DESTROY . Ce message est envoyé après la suppression de la fenêtre de l’écran, mais avant la destruction (en particulier, avant la destruction des fenêtres enfants).
Dans votre fenêtre d’application main, vous répondez généralement à WM_DESTROY en appelant PostQuitMessage.
case WM_DESTROY:
PostQuitMessage(0);
return 0;
Nous avons vu dans la section Messages de fenêtre que PostQuitMessage place un message WM_QUIT dans la file d’attente des messages, ce qui entraîne la fin de la boucle de message.
Voici un organigramme montrant la façon classique de traiter les messages WM_CLOSE et WM_DESTROY :