2008-09-20 8 views
1

J'ai une application Windows Forms .NET 2.0. Sur cette application, il y a un contrôle de formulaire avec une barre de menu et une barre d'état. Il y a aussi un ListView sur ce formulaire.Menu contextuel WinForms - non ouvert dans certaines parties/détection du contrôle sous-jacent

Si j'ajoute un menu contextuel à ce formulaire, le menu contextuel s'ouvre lorsque l'utilisateur clique avec le bouton droit sur n'importe quelle partie du formulaire, y compris la barre de menus et la barre d'état.

  1. Comment puis-je empêcher le menu contextuel de l'ouverture lorsque le clic est arrivé sur la barre de menu/barre d'état? Je ne veux l'ouvrir que lorsque vous cliquez sur la "zone grise" du formulaire.

  2. Si le clic s'est passé au-dessus d'un contrôle sur ce formulaire (par exemple, sur ListView), comment puis-je l'identifier? J'aimerais savoir si l'utilisateur a cliqué avec le bouton droit au-dessus de la zone grise ou au-dessus de ListView, afin que je puisse activer/désactiver certains éléments de menu basés dessus.

Répondre

1

Je trouve la réponse:

Point clientPos = this.PointToClient(Form.MousePosition); 
Control control = this.GetChildAtPoint(clientPos); 

Cela devrait donner le contrôle sous-jacent qui a été cliqué sur le formulaire, ou null si le clic est sur la zone grise. Nous avons donc juste besoin de tester le type de contrôle sur l'événement Opening du menu contextuel. Si c'est MenuStrip, ToolStrip ou StatusStrip, faites e.Cancel = true ;.

3

Une fois que vous avez placé votre barre d'état au bas et MenuStrip en haut,

  1. Set ContextMenuStrip sur votre formulaire Aucun
  2. Placez un panneau standard au milieu (entre MenuStrip et StatusStrip) avec la propriété Dock définie sur Remplissez.
  3. Définissez la propriété ContextMenuStrip sur votre Panel (au lieu de sur le formulaire).

et placez-le ListView et tous les autres contrôles qui devraient être mises en forme dans le panneau

Par exemple,

~~~~~~~~~~~~~

MenuStrip

~~~~~~~~~~~~~

Panel

. Dock = Remplir. ContextMenuStrip = yourContextMenu.

~~~~~~~~~~~~~

StatusStrip

~~~~~~~~~~~~~