2009-12-22 5 views
1

Je voudrais un menu contextuel sur la barre de légende clic droitComment gérer la légende de formulaire faites un clic droit

des conseils/échantillons pref en C#?

MISE À JOUR - pour diverses raisons, faites un clic droit sur le formulaire ne fonctionnera pas parce que la forme est pas vide et la forme est composited dynamiquement si ....

+2

Cliquez droit sur le formulaire ou la légende du formulaire ?? – gbianchi

+0

il n'y a pas de clic souris sur la légende, autant que je peux dire, vous devez vous accrocher dans le win32 pour gérer les événements de la zone non client que je n'ai pas fait depuis ... – Kumar

Répondre

9

Vous pouvez le faire en intercepter la notification WM_NCRBUTTONDOWN que Windows envoie lorsque l'utilisateur clique avec le bouton droit sur la barre de titre. La classe de contrôle n'a pas d'événement, vous devrez remplacer WndProc(). Voici un exemple de formulaire, vous devrez ajouter un ContextMenuStrip:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    protected void OnTitlebarClick(Point pos) { 
     contextMenuStrip1.Show(pos); 
    } 

    protected override void WndProc(ref Message m) { 
     const int WM_NCRBUTTONDOWN = 0xa4; 
     if (m.Msg == WM_NCRBUTTONDOWN) { 
      var pos = new Point(m.LParam.ToInt32()); 
      OnTitlebarClick(pos); 
      return; 
     }           
     base.WndProc(ref m); 
    } 
} 
0

MSDN explains comment gérer les clics droits sur Windows Forms contrôles. Les contrôles, y compris les formulaires, héritent de l'événement MouseClick.

MouseEventArgs vous indiquera quel bouton a été cliqué sur la propriété Button. Jetez un oeil à l'énumération MouseButtons.

+0

a mis à jour la question – Kumar

+0

. Malheureusement, il n'y a pas de MousePreview comme il y a un KeyPreview, donc je ne suis pas sûr de savoir comment résoudre ce problème. –

0

si vous gérez la forme un clic de souris, vous pouvez utiliser le code suivant:

private void Dialog_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     {         
      this.Text = "new caption text"; 
     } 
    } 

Mais vous devrez vous assurer que vous générez cet événement pour le contrôle de haut niveau sur un formulaire . Par exemple si vous avez une zone de groupe sur le formulaire, il recevra les événements de clic de souris plutôt que le formulaire lui-même, pour les zones du formulaire qui sont sous la zone de groupe.

0

Il existe déjà un menu géré par Windows lorsque vous cliquez avec le bouton droit sur la barre de titre.

Voulez-vous le remplacer complètement?

Si vous voulez ajouter, vous devrez utiliser l'API Win32 et interopérer et vous devrez sous-classer le formulaire.

Voir la fonction AppendMenu().

0

Fondamentalement, vous devez utiliser p-invoke pour ce faire. Il y a un très bon exemple à Here Vous pouvez voir dans l'exemple que vous devrez imiter manuellement les gestionnaires d'événements, mais c'est assez simple.

0

Vous pouvez remplacer WndProc de la forme et de capturer le message WM_NCRBUTTONDOWN:

protected override void WndProc(ref Message m) 
    { 
     const int WM_NCRBUTTONDOWN = 0xA4; 

     if (m.Msg == WM_NCRBUTTONDOWN) 
     { 
      MessageBox.Show("Caption right clicked!"); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 

Ce code supprime cependant le menu contextuel de la fenêtre,. Vous ne pouvez pas souhaiter ceci. Le message WM_NCRBUTTONDOWN sera également envoyé si vous cliquez avec le bouton droit sur les bordures de la fenêtre. Vous ne pouvez pas désirer cela non plus.

Questions connexes