Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 79

Comment empêcher la fermeture d'un form ?

La première solution consiste à annuler toute tentative de fermeture dans l'événement Unload du form :

Private Sub Form_Unload(Cancel As Integer)

    Cancel = True

End Sub

Cette annulation peut aussi se réaliser dans l'événement Query_Unload du fom. L'avantage de cet événement est que celui-ci permet de connaître la cause de cette fermeture :

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

    Select Case UnloadMode
        Case vbFormControlMenu
            MsgBox "L'utilisateur a choisi dans le menu Système de la feuille la commande Fermeture."
            Cancel = True
        Case vbFormCode
            MsgBox "L'instruction Unload est invoquée à partir du code."
            Cancel = True
        Case vbAppWindows
            MsgBox "La session Microsoft Windows en cours prend fin."
        Case vbAppTaskManager
            MsgBox "Le Gestionnaire de tâches de Microsoft Windows ferme l'application."
        Case vbFormMDIForm
            MsgBox "Une feuille MDI fille se ferme en raison de la fermeture de la feuille MDI."
        Case vbFormOwner
            MsgBox "Une feuille se ferme en raison de la fermeture de son propriétaire."
    End Select

End Sub

Une troisième solution est de mettre la propriété "ControlBox" de la feuille à "False". Cela a pour effet d'enlever le bouton de fermeture, mais aussi les boutons "minimiser" et "maximiser".

Une quatrième solution est d'employer les API afin de désactiver le bouton de fermeture, en d'autres mots de le "griser" :

Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

Private Const SC_CLOSE As Long = &HF060&
Private Const MF_BYCOMMAND As Long = &H0&
Private Const MF_BYPOSITION = &H400&

Private Sub Form_Click()

    Unload Me

End Sub

Private Sub Form_Load()

    Dim hSysMenu As Long

    ' Récupère le handle du menu système
    hSysMenu = GetSystemMenu(hwnd, False)
    ' Supprime le menu "Fermer"
    Call DeleteMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND)
    ' Supprime la barre d'espacement
    Call DeleteMenu(hSysMenu, GetMenuItemCount(hSysMenu) - 1, MF_BYPOSITION)
    ' Redessine la barre de menu
    Call DrawMenuBar(Me.hwnd)

    Me.Caption = "Pour fermer la feuille, cliquez dessus"

End Sub

Date de publication : 16 septembre 2002
Dernière modification : 16 septembre 2002
Rubriques : Généralités
Mots-clés : fermeture, empêcher, cancel, annuler, Unload, Query_Unload, croix, ControlBox, fermer