Showing a context menu in ArcGIS Desktop applications
A context menu is a menu that appears upon user interaction, typically a right mouse click. Context menus are implemented following a straightforward pattern: use ICommandBar.Popup to open a particular menu in response to an event. ArcObjects exposes two OnContextMenu events (ITool.OnContextMenu and IDocumentEvents.OnContextMenu) that automatically fire when a user right-clicks in the active view. To show a context menu only when your tool is active, use ITool.OnContextMenu. To show a context menu regardless of the active tool, use an extension that responds to IDocumentEvents.OnContextMenu.
If you're working outside the active view - such as in a dialog box or a control, including the ArcGIS controls (for example, MapControl) - use the OnMouseUp or OnMouseDown events.
After deciding which event to respond to, follow these steps to show a particular menu:
- Get a reference to the context menu (ICommandBar interface) using one of the following methods:
- Determine the unique identifier object (UID) of the custom context menu component and load with ICommandBars.Find.
- Create one programmatically with ICommandBars.Create and ICommandBar.Add.
- Determine the menu location (absolute screen location)
- Use the default x,y value of 0, or leave the optional parameter blank (Visual Basic [VB] .NET).
- Optional: Listen to the control mouse events and convert the location with the System.Windows.Forms.Control.PointToScreen method or use the System.Windows.Forms.Control.MousePosition static property.
- Show the menu using ICommandBar.Popup.
protected override bool OnContextMenu(int x, int y) { ESRI.ArcGIS.esriSystem.UIDClass uid=new ESRI.ArcGIS.esriSystem.UIDClass(); uid.Value="AcmeContextMenu"; IDocument document=ArcMap.Document as IDocument; ICommandBar menu=document.CommandBars.Find(uid, false, false)as ICommandBar; if (menu == null) return false; menu.Popup(0, 0); // Use 0,0 to display the menu at the current mouse location. return true; }[VB.NET]
Protected Overloads Overrides Function OnContextMenu(ByVal x As Integer, ByVal y As Integer) As Boolean
Dim uid As New ESRI.ArcGIS.esriSystem.UIDClass()
uid.Value="AcmeContextMenu"
Dim document As IDocument=TryCast(ArcMap.Document, IDocument)
Dim menu As ICommandBar=TryCast(document.CommandBars.Find(uid, False, False), ICommandBar)
If menu Is Nothing Then
Return False
End If
menu.Popup(0, 0) ' Use 0,0 to display the menu at the current mouse location.
Return True
End Function
See Also:
Creating toolbars and menusSample: Simple logging dockable window with a custom context menu
To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
- ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)
- ESRI.ArcGIS.Framework
Development licensing | Deployment licensing |
---|---|
ArcGIS Desktop Basic | ArcGIS Desktop Basic |
ArcGIS Desktop Standard | ArcGIS Desktop Standard |
ArcGIS Desktop Advanced | ArcGIS Desktop Advanced |