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 |