2 votes

Boîte de dialogue personnalisée sans déclenchement de l'activation du formulaire

J'ai développé un MsgBox personnalisé qui fonctionne bien de presque toutes les manières. Le seul problème est que lorsque le MsgBox se ferme, le formulaire parent exécute le code Form_Activate. Un MsgBox normal ne lance pas ce code (encore).

Je sais que je pourrais ajouter une variable booléenne à Form_Activate pour vérifier si elle a déjà été lancée, mais ce n'est pas la meilleure solution lorsque vous avez une douzaine de formulaires. Donc, y a-t-il un moyen de ne pas exécuter Form_Activate après la fermeture de mon MsgBox personnalisé? Le formulaire MsgBox doit-il être d'un type spécifique ou quelque chose comme ça? J'ai essayé tous les BorderStyles mais cela ne fait aucune différence.

2voto

Gonzalo Points 1180

Utilisez-vous une autre forme pour créer une MsgBox personnalisée?

Vous ne devez pas utiliser directement une autre forme pour afficher une boîte de message personnalisée. Vous devriez créer un contrôle Activex, et l'événement Activate ne se déclenchera pas de nouveau lorsque la MsgBox est fermée.

A l'intérieur du contrôle, vous pouvez utiliser un formulaire si vous le souhaitez. (Probablement vous devez seulement placer votre code à l'intérieur d'un projet de contrôle Activex et l'utiliser dans vos formulaires)

C'est ainsi que je l'utilise.

Voici un exemple de MsgBox personnalisée utilisant le contrôle Activex, avec un formulaire de test également.

http://www.codeguru.com/code/legacy/vb_othctrl/2166_CustomMsgBox.zip

0voto

J'ai créé une classe pour une boîte de dialogue personnalisée.

Public Class CustomMsgBox
'Crée le formulaire principal
Dim Main As New Form

'Crée les boutons
Dim Btn1, Btn2, Btn3 As New Button

'Crée l'étiquette
Dim Lbl As New Label

'Crée la variable de sortie
Dim Output As Integer = 0

Private Sub Load()
    'Propriétés du Btn1
    Btn1.Location = New Point(168, 69)
    Btn1.AutoSize = True
    Btn1.AutoSizeMode = AutoSizeMode.GrowOnly

    'Propriétés du Btn2
    Btn2.Location = New Point(87, 69)
    Btn1.AutoSize = True
    Btn1.AutoSizeMode = AutoSizeMode.GrowOnly

    'Propriétés du Btn3
    Btn3.Location = New Point(6, 69)
    Btn1.AutoSize = True
    Btn1.AutoSizeMode = AutoSizeMode.GrowOnly

    'Propriétés du Lbl
    Lbl.Location = New Point(12, 19)
    Lbl.AutoSize = True
    Lbl.AutoEllipsis = True

    'Propriétés du formulaire principal
    Main.Size = New Size(211, 129)
    Main.AutoSize = True
    Main.AutoSizeMode = AutoSizeMode.GrowOnly
    Main.ShowIcon = False
    Main.Controls.Add(Btn1)
    Main.Controls.Add(Btn2)
    Main.Controls.Add(Btn3)
    Main.Controls.Add(Lbl)

    'Ajoute des gestionnaires aux boutons
    AddHandler Btn1.Click, AddressOf btn1_Click
    AddHandler Btn2.Click, AddressOf btn2_Click
    AddHandler Btn3.Click, AddressOf btn3_Click

End Sub

Function CstMsgBox(ByRef Msg As String, ByRef Title As String, ByRef B1 As String, Optional ByRef B2 As String = Nothing, Optional ByRef B3 As String = Nothing) As Integer
    'Exécute la sous-procédure Load()
    Load()

    'Définit les valeurs
    Lbl.Text = Msg
    Btn1.Text = B1
    Btn2.Text = B2
    Btn3.Text = B3
    Main.Text = Title

    'Vérifie s'il y a une valeur définie pour Btn2 et Btn3
    If Btn2.Text = Nothing Then
        Btn2.Hide()
    End If
    If Btn3.Text = Nothing Then
        Btn3.Hide()
    End If

    'Affiche la boîte de dialogue
    Main.Show()

    'Attend qu'un bouton soit appuyé
    Do Until Output <> 0
        Application.DoEvents()
    Loop

    'Ferme la boîte de dialogue
    Main.Close()
    Return Output

End Function

Private Sub btn1_Click(ByVal sender As Object, ByVal e As EventArgs)
    'Définit la valeur de sortie à 1
    Output = 1

End Sub

Private Sub btn2_Click(ByVal sender As Object, ByVal e As EventArgs)
    'Définit la valeur de sortie à 2
    Output = 2

End Sub

Private Sub btn3_Click(ByVal sender As Object, ByVal e As EventArgs)
    'Définit la valeur de sortie à 3
    Output = 3

End Sub
End Class

Vous pouvez l'utiliser en tapant ceci :

Dim CMB As New CustomMsgBox
    CCMB.CstMsgBox('MSG, 'TITRE, 'BOUTON1, 'Optionnel : BOUTON2, 'Optionnel : BOUTON3)

Ou

Dim CMB As New CustomMsgBox
    Select Case CMB.CstMsgBox('MSG, 'TITRE, 'BOUTON1, 'Optionnel : BOUTON2, 'Optionnel : BOUTON3)
        Case 1
            'Code à exécuter lorsque le bouton1 est pressé
        Case 2
            'Code à exécuter lorsque le bouton2 est pressé
        Case 3
            'Code à exécuter lorsque le bouton3 est pressé
    End Select

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