none
Menu sur un bouton RRS feed

  • Question

  • Bonjour,

    Dans une application WinForm, sous VS 2010, en VB.Net, j'ai placé un bouton. 

    Je voudrais ouvrir un menu sur ce bouton lorsque l'utilisateur clique sur sa partie droite.

    L’évènement Bouton.MouseDown fournit la position du curseur sur le bouton. Ok.

    Mais ensuite, quelle technique utiliser ? J'ai essayé avec un MenuToolStrip mais je ne peux le localiser au bon endroit (la position du curseur).

    Merci de vos conseils.

    Cordialement.


    Alain

    mercredi 19 décembre 2012 14:06

Réponses

  • Au temps pour moi,

    Ouvrir un ContextMenuStrip par programmation est assez simple :

    contextMenuStrip1.Show(button1, button1.PointToClient(Control.MousePosition));

    Le point important est de transmettre un point relatif au contrôle d'ouverture. Dans cet exemple comme je prends les coordonnées de la souris au niveau du système j'ai sa position par rapport à l'écran, j'utilise donc PointToClient() pour transformer ce point en coordonnées relatives au contrôle.

    Dans un MouseDown par exemple la position de la souris est relative au contrôle qui a émis l'évènement on peut donc faire :

            private void button1_MouseDown(object sender, MouseEventArgs e) {
                if (e.Button == System.Windows.Forms.MouseButtons.Left) {
                    contextMenuStrip1.Show(button1, e.Location);
                }
            }
    

    Avec bien sur "button1" mon bouton, et "contextMenuStrip1" mon menu contextuel.

    A vous de calculer la bonne position si vous voulez afficher le menu en haut ou en bas, il y a un troisième paramètre dans la méthode "Show()" du menu contextuel qui permet de définir dans quelle direction par rapport au point doit s'afficher le menu.

    Cordialement,

    Yan Grenier

    • Proposé comme réponse Yan Grenier - MTFC mercredi 19 décembre 2012 20:31
    • Marqué comme réponse AchLog mercredi 19 décembre 2012 20:44
    • Non marqué comme réponse AchLog mercredi 19 décembre 2012 20:44
    • Marqué comme réponse AchLog mercredi 19 décembre 2012 20:45
    mercredi 19 décembre 2012 20:30

Toutes les réponses

  • Bonjour,

    Rien de plus simple, il faut créer un menu contextuel et l'attribuer à votre bouton.

    • Créer "ContextMenuStrip" dans votre Form
    • Définir les éléments du menu
    • Attribuer votre menu contextuel à la propriété "ContextMenuStrip" du bouton

    Ce principe fonctionne pour tous les contrôles Winform, et un menu contextuel peut être partagé par plusieurs contrôles. Il y a des évènements qui permettent de faire des traitements à l'ouverture du menu, et la propriété "SourceControl" du menu permet de connaître le contrôle qui à invoqué le menu lorsqu'il est ouvert.

    Cordialement,

    Yan Grenier

    mercredi 19 décembre 2012 14:32
  • Bonjour Yan,

    Merci de votre réponse. Mais je crois que le ContextMenuStrip ne fonctionne QUE sur le clic droit, non ?

    Je voudrais faire apparaître le menu sur clic gauche, comme par exemple dans Visual Studio : Add existant Item, Open : ouvrir l'élément sélectionné ou ouvrir comme lien.

    Cordialement


    Alain

    mercredi 19 décembre 2012 20:15
  • Au temps pour moi,

    Ouvrir un ContextMenuStrip par programmation est assez simple :

    contextMenuStrip1.Show(button1, button1.PointToClient(Control.MousePosition));

    Le point important est de transmettre un point relatif au contrôle d'ouverture. Dans cet exemple comme je prends les coordonnées de la souris au niveau du système j'ai sa position par rapport à l'écran, j'utilise donc PointToClient() pour transformer ce point en coordonnées relatives au contrôle.

    Dans un MouseDown par exemple la position de la souris est relative au contrôle qui a émis l'évènement on peut donc faire :

            private void button1_MouseDown(object sender, MouseEventArgs e) {
                if (e.Button == System.Windows.Forms.MouseButtons.Left) {
                    contextMenuStrip1.Show(button1, e.Location);
                }
            }
    

    Avec bien sur "button1" mon bouton, et "contextMenuStrip1" mon menu contextuel.

    A vous de calculer la bonne position si vous voulez afficher le menu en haut ou en bas, il y a un troisième paramètre dans la méthode "Show()" du menu contextuel qui permet de définir dans quelle direction par rapport au point doit s'afficher le menu.

    Cordialement,

    Yan Grenier

    • Proposé comme réponse Yan Grenier - MTFC mercredi 19 décembre 2012 20:31
    • Marqué comme réponse AchLog mercredi 19 décembre 2012 20:44
    • Non marqué comme réponse AchLog mercredi 19 décembre 2012 20:44
    • Marqué comme réponse AchLog mercredi 19 décembre 2012 20:45
    mercredi 19 décembre 2012 20:30
  • Parfait !

    Grand merci Yan pour votre réponse rapide et efficace. ça fonctionne au poil.

    Bien cordialement.


    Alain

    mercredi 19 décembre 2012 20:46