IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Comment empêcher l'utilisation de la croix pour fermer?


Sujet :

Windows Forms

  1. #1
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut Comment empêcher l'utilisation de la croix pour fermer?
    Bonjour à tous,

    Je sais que la question a surement déjà été posée, mais je n'y arrive pas.
    Je cherche à faire quelque chose de très simple, réduire la fenêtre quand on clique sur la croix et n'autoriser la fermeture de l'appli (donc cette fameuse fenêtre) qu'avec l'utilisation d'un bouton.

    J'ai donc regardé la faq et j'ai trouvé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
    e.Cancel = true;//On annule la fermeture
    }
    Seulement voilà, cet évenement est produit dès qu'on tente de fermer la fenêtre. Ce qui la rend... impossible à fermer! que ce soit avec la croix ou le bouton.

    Juste au dessus j'ai trouvé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Application.ApplicationExit  += new EventHandler(Application_Exit);
    //...
    private static void Application_Exit(object sender, System.EventArgs e)
    {
        MessageBox.Show("Adieu vilaine brute");
    }
     
    private void button1_Click(object sender, System.EventArgs e)
    {
    Application.Exit();
    }
    Mais la, le System.EvenArgs ne contient pas de Cancel que l'on pourrait mettre à true.

    L'appel de Application.Exit() dans l'évenement produit quand on clique sur mon bouton ferme la fenêtre mais... trop brutalement apparement. plein de processus fils ne sont pas tués et se zombifient...

    Je suppose que la solution se trouve dans l'analyse du sender de la première méthode et juste vérifier qui a été pressé puis d'effectuer l'action mais... je ne sais rien à propos de la croix!! comment la distinguer de mon bouton?

    ça ne doit pas être compliqué, mais là, je ne vois pas comment faire...

    Merci pour votre aide.

  2. #2
    Membre régulier Avatar de LexWizard
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 101
    Points : 119
    Points
    119
    Par défaut
    Salut,

    le plus simple, tu déclare un bool

    Puis dans l'evenement clik de ton button tu place le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exit = true;
    this.close();
    Et enfin dans l'évenement Closing de ta form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!exit)
    {
        e.cancel=true;
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Autre solution que je trouve un peu plus propre : utiliser le CloseReason

    Ce qui te donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
            e.Cancel = true;//On annule la fermeture
    }

  4. #4
    Membre régulier Avatar de LexWizard
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 101
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Drahas
    Autre solution que je trouve un peu plus propre : utiliser le CloseReason

    Ce qui te donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
            e.Cancel = true;//On annule la fermeture
    }
    Salut,

    Le problème c'est qu'avec ce code, que se soit en cliquant sur la croix, ou en cliquant sur un bouton, la Form ne va jamais se fermer...

  5. #5
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    c'est sur que la solution du booléen fonctionne. C'est celle que j'utilise en attendant, mais je ne la trouve pas très pro...
    Il doit bien y avoir un moyen de le faire en se basant sur le sender non?

  6. #6
    Membre régulier Avatar de LexWizard
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 101
    Points : 119
    Points
    119
    Par défaut
    Moi j'utilise aussi le booléen.

    Sinon il est possible d'appeler la méthode
    sur le bouton, et dans l'Evenement Closing :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (e.CloseReason != CloseReason.ApplicationExitCall)
    {
        e.Cancel = true;
    }
    Mais bon...J'aime pas cette solution "brutale", mais pour certain appli, ça peut faire l'affaire.

    Si il existe autre chose, je suis preneur !

  7. #7
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    ça aussi ça marche, mais encore plus "salement".
    mon application comporte une floppé de thread et ils ne sont pas terminés quand Application.Exit() est directement appelée.

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 79
    Points : 355
    Points
    355
    Par défaut
    Pour fermer ton application, tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    Application.ExitThread();
    
    Je ne suis pas sûr que ca marche mais ça vaut le coup d'essayer.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    si tu appelles Application.Exit() (Application.ExitThread() pour le thread courant), le programme va terminer toutes les boucles de messages courantes (ou seulement celle du thread courant avec .ExitThread()) en retournant d'Application.Run(), à toi de voir comment arreter tous les autres threads foregrounds (event de sortie etc ), si tu en as, sinon il resteront dans leurs etats et l'application ne se terminera pas (comme c'est le cas actuellement apparement =p).

    Donc je pense que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public void StartPresentation()
    {
        Application.Run(f);
        //On dispose une fois qu'Application.Run() retourne
        f.Dispose();
     
        //on s'occupe de fermer proprement les autres threads.
    }
     
    //Le callback qui declenchera la fermeture effective de ton UI
    void controlX_Click(object sender, EventArgs e)
    {
        //Hypothese : on est sur le thread de l'UI.
        //On arrete la boucle du thread courant
        Application.ExitThread();
    }
     
    void monUI_FormClosing(object sender, FormClosingEventArgs e)
    {
        if(e.ClosingReason == UserClosing)
            e.Cancel = true;
    }
    Apres à toi de voir comment arreter proprement toutes tes taches, mais en empechant la fermeture de la Form, je vois pas plus propre comme methode pour fermer l'appli.

    Bon courage.

  10. #10
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    Salut,

    J'ai finit par gérer les threads "à la main" et m'assurer qu'ils se terminaient avant de fermer l'appli elle même.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Comment empêcher l'utilisation des touches F1 à F16 dans un état
    Par electrosat03 dans le forum IHM
    Réponses: 10
    Dernier message: 07/07/2009, 17h37
  2. Réponses: 1
    Dernier message: 11/12/2007, 17h45
  3. Réponses: 1
    Dernier message: 11/10/2006, 14h24
  4. Réponses: 5
    Dernier message: 08/09/2006, 12h23
  5. Réponses: 9
    Dernier message: 10/08/2006, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo