none
Gestion du ContextMenu RRS feed

  • Question

  • Bonjour,

    Dans mon appli WinForm /Framework 2.0, j'utilise un ContextMenu qui s'affiche (tout seul) sur clic droit sur un PictureBox. Ok.

    L'appli gère les événements MouseDown et MouseUp sur ce PictureBox. Mais je voudrais fermer le ContextMenu, s'il est ouvert, lorsqu'elle reçoit MouseDown, plutôt que traiter cet événement normalement, comme s'il ne l'était pas.

    Il faudrait, au minimum, que l'appli puisse savoir si le ContexteMenu est affiché ou non à l'écran lorsqu'arrive cet événement MouseDown.

    Est-ce possible ? Comment faire cela ? Je ne vois pas de propriété (Visible par exemple) ni de méthode du ContextMenu qui le permette.

    Merci de vos idées.

     


    Alain
    jeudi 6 mai 2010 10:33

Réponses

  • Bonjour,

    Utilisez le contrôle ContextMenuStrip au lieu de ContextMenu. Le contrôle ContextMenuStrip contient une propriété Visible qui devrait correspondre à vos besoins.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse AchLog jeudi 6 mai 2010 20:26
    jeudi 6 mai 2010 19:19
    Modérateur

Toutes les réponses

  • Bonjour,

    Utilisez le contrôle ContextMenuStrip au lieu de ContextMenu. Le contrôle ContextMenuStrip contient une propriété Visible qui devrait correspondre à vos besoins.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse AchLog jeudi 6 mai 2010 20:26
    jeudi 6 mai 2010 19:19
    Modérateur
  • En effet, c'est à cela que j'étais arrivé. Je voulais m'assurer qu'il n'y avait pas une solution avec le ContextMenu.

    Merci Gilles.

     


    Alain
    jeudi 6 mai 2010 20:27
  • Bonsoir,

     

    Je reviens sur cette question. J'ai fait un essai avec ContextMenuStrip et, en effet, beaucoup d'événements sont gérables.

    Cependant je n'ai pas résolu mon problème que je rappelle en deux mots : lors de la fermeture du ContextMenuStrip par clic sur le contrôle support, celui-ci reçoit un évènement MouseDown lorsque le menu est fermé et je voudrais :

     

    • soit qu'il ne le reçoive pas
    • soit qu'il puisse détecter qu'il s'agit d'un clic qui ferme le menu.

    J'ai pensé noter dans une variable que le menu avait été ouvert (sur son événement Opened par exemple). Si le menu est fermé par un clic sur le contrôle support celui-ci sait qu'il s'agit de la fermeture du menu et ne traite pas de MouseDown. Mais, si le menu est fermé par un clic hors du contrôle support, celui-ci ne recevant pas de MouseDown la variable reste positionnée et le prochain MouseDown efficace est manqué ! J'espère que mon explication est claire...

    La seule façon de faire, à mon sens, serait donc que le contrôle support ne reçoive pas le MouseDown de fermeture du menu. Le ContextMenuStrip peut-il interrompre la propagation de l'événement MouseDown qui provoque sa fermeture ? Comment faire cela ? Dans les événements Closing ou Closed du ContextMenuStrip ?

    Merci de vos suggestions.

     


    Alain
    • Modifié AchLog samedi 15 mai 2010 21:17 rectification
    samedi 15 mai 2010 21:11
  • Bonjour,

    Dans ce cas utilisez l'événement Closing. Vous avez la possibilité dans cette événement d'annuler ou non la fermeture du ContextMenuStrip en fonction de votre propre logique. Pour cela définissez la propriété Cancel de l'argument de l'événement à True.

    ' Annuler la fermeture du ContextMenuStrip
    e.Cancel = True

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    dimanche 16 mai 2010 08:49
    Modérateur
  • Hélas Gilles,cela ne fonctionne pas car, il ne s'agit pas de laisser ouvert le ContexteMenuStrip.

    Voici la solution que j'ai adoptée :

      Private Sub CtxMenu_Clic()
        ' Tous les items du CtxMenu arrivent ici
        CtxMenu.Tag = True   ' Marquer que le traitement est exécuté
      End Sub
    
      Private Sub CtxMenu_Opened(ByVal sender As Object, ByVal e As System.EventArgs) Handles CtxMenu.Opened
        ' Ouverture du CtxMenu
        CtxMenu.Tag = False   ' Marquer que le traitement n'est pas encore exécuté
      End Sub
    
      Private Sub PicBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicBox.MouseDown
    
        If e.Button = MouseButtons.Left Then
    
          If CtxMenu.Tag Then
            ' Clic valide
            Console.WriteLine("Traite")
          Else
            ' Fermeture du CtxMenu sans sélection d'item
            CtxMenu.Tag = True
            Console.WriteLine("Passe")
          End If
        End If
    
      End Sub
    

    Lorsqu'un item du menu est exécuté (CtxMenu_Clic dans cet exemple) le Tag = True, dans le cas contraire (celui qui m'intéresse) le Tag = False.

    Et le contrôle PicBox qui reçoit le MouseDown sait ainsi si le menu a été traité ou s'il est juste fermé sans traitement.

    Je m'étais mal expliqué, je m'en rend compte maintenant.

    Cordialement

     


    Alain
    dimanche 16 mai 2010 21:27