77 votes

Remplacer le bouton de fermeture standard (X) dans un Windows Form

Comment puis-je changer ce qui se passe lorsqu'un utilisateur clique sur le bouton de fermeture (X rouge) dans une application Windows Forms (en C #)?

137voto

Jon B Points 26872

Pour cela, vous pouvez remplacer OnFormClosing . Veillez simplement à ne rien faire de trop inattendu, car cliquer sur le 'X' pour fermer est un comportement bien compris.

 protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    if (e.CloseReason == CloseReason.WindowsShutDown) return;

    // Confirm user wants to close
    switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo))
    {
    case DialogResult.No:
        e.Cancel = true;
        break;
    default:
        break;
    }        
}
 

21voto

Philip Wallace Points 4550

Remplacer le OnFormClosing méthode.

ATTENTION: Vous devez vérifier la CloseReason et seulement modifier le comportement si elle est UserClosing. Vous ne devriez pas mettre quelque chose ici qui pourrait bloquer l'arrêt de Windows, de la routine.

L'Arrêt de l'Application des Modifications apportées dans Windows Vista

C'est à partir du logo Windows 7 exigences du programme: alt text

18voto

Jason Thaxter Points 221

Une chose qui manque à ces réponses, et que les débutants recherchent probablement, est qu’il est agréable d’avoir un événement:

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // do something
}
 

Cela ne fera rien du tout, sauf si vous enregistrez l'événement. Mettez ceci dans le constructeur de la classe:

 this.FormClosing += Form1_FormClosing;
 

10voto

Chap Points 1846

Soit remplacer le OnFormClosing ou de vous inscrire pour l'événement FormClosing.

Ceci est un exemple de substitution de la OnFormClosing fonction dans le dérivé de la forme:

protected override void OnFormClosing(FormClosingEventArgs e)
{
   e.Cancel = true;
}

Ceci est un exemple de la gestionnaire de l'événement pour arrêter la forme de fermeture qui peut être dans toute la classe:

private void FormClosing(object sender,FormClosingEventArgs e)
{  
   e.Cancel = true;
}

Pour obtenir plus avancé, cochez la CloseReason bien sur la FormClosingEventArgs à assurer que l'action est effectuée. Vous voudrez peut-être que ne l'alternative de l'action si l'utilisateur essaie de fermer le formulaire.

9voto

Lo Sauer Points 5469

comme l'a dit Jon B, mais vous voudrez également vérifier les ApplicationExitCall et TaskManagerClosing CloseReason:

 protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (  e.CloseReason == CloseReason.WindowsShutDown 
        ||e.CloseReason == CloseReason.ApplicationExitCall
        ||e.CloseReason == CloseReason.TaskManagerClosing) { 
       return; 
    }
    e.Cancel = true;
    //assuming you want the close-button to only hide the form, 
    //and are overriding the form's OnFormClosing method:
    this.Hide();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X