Autodesk.AutoCAD.ApplicationServices.Application 支持两种 ContextMenu 扩展:DefaultContextMenu 和 ObjectContextMenu。
DefaultContextMenu:当前上下文环境没有选中任何 Entity 情况下的快捷菜单。
ObjectContextMenu:当前上下文环境选中指定类型 Entity 情况下的快捷菜单。如下图:
#region
AddContextMenu
/// <summary>
/// 添加右键菜单
/// </summary>
private void AddContextMenu()
{
try
{
// DefaultContextMenu
ContextMenuExtension defaultContextMenu = new ContextMenuExtension();
defaultContextMenu.Title = " MyDefaultContextMenu " ;
Autodesk.AutoCAD.Windows.MenuItem defaultContextMenu_Item1 = new Autodesk.AutoCAD.Windows.MenuItem( " MyDefaultContextMenu_Item1 " , ARX.UI.Resources.Resource1.taobao);
defaultContextMenu_Item1.Click += new EventHandler(defaultContextMenu_OnClick);
defaultContextMenu.MenuItems.Add(defaultContextMenu_Item1);
ArxApp.AddDefaultContextMenuExtension(defaultContextMenu);
// ObjectContextMenu
ContextMenuExtension objContextMenu = new ContextMenuExtension();
objContextMenu.Title = " MyObjectContextMenu " ;
objContextMenu.Popup += new EventHandler(objContextMenu_Popup);
Autodesk.AutoCAD.Windows.MenuItem objContextMenu_Item1 = new Autodesk.AutoCAD.Windows.MenuItem( " Go to Baidu " , ARX.UI.Resources.Resource1.baidu);
objContextMenu_Item1.Click += new EventHandler(objContextMenu_Item1_Click);
objContextMenu.MenuItems.Add(objContextMenu_Item1);
Autodesk.AutoCAD.Windows.MenuItem objContextMenu_Item2 = new Autodesk.AutoCAD.Windows.MenuItem( " Go to Google " , ARX.UI.Resources.Resource1.google);
objContextMenu_Item2.Click += new EventHandler(objContextMenu_Item2_Click);
objContextMenu.MenuItems.Add(objContextMenu_Item2);
ArxApp.AddObjectContextMenuExtension(RXObject.GetClass( typeof (Polyline)), objContextMenu);
}
catch (System.Exception exc)
{
WriteLine( string .Format( " \n ContextMenu error: {0} " , exc.Message));
}
}
void objContextMenu_Popup( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
bool visible = true ;
// If that is multiple selection, disabled the menu item.
PromptSelectionResult selectionRes = ed.SelectImplied();
if (selectionRes.Status == PromptStatus.OK)
{
ObjectId[] objIds = selectionRes.Value.GetObjectIds();
if (objIds != null && objIds.Length > 1 )
{
visible = false ;
}
}
ContextMenuExtension objContextMenu = sender as ContextMenuExtension;
if (objContextMenu != null )
{
foreach (MenuItem item in objContextMenu.MenuItems)
{
item.Enabled = visible;
}
}
}
}
private void defaultContextMenu_OnClick( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
ArxApp.ShowAlertDialog( " defaultContextMenu_OnClick " );
}
}
void objContextMenu_Item1_Click( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
System.Diagnostics.Process.Start( " IEXPLORE.EXE " , " http://www.baidu.com " );
}
}
void objContextMenu_Item2_Click( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
System.Diagnostics.Process.Start( " IEXPLORE.EXE " , " http://www.google.com " );
}
}
#endregion
/// <summary>
/// 添加右键菜单
/// </summary>
private void AddContextMenu()
{
try
{
// DefaultContextMenu
ContextMenuExtension defaultContextMenu = new ContextMenuExtension();
defaultContextMenu.Title = " MyDefaultContextMenu " ;
Autodesk.AutoCAD.Windows.MenuItem defaultContextMenu_Item1 = new Autodesk.AutoCAD.Windows.MenuItem( " MyDefaultContextMenu_Item1 " , ARX.UI.Resources.Resource1.taobao);
defaultContextMenu_Item1.Click += new EventHandler(defaultContextMenu_OnClick);
defaultContextMenu.MenuItems.Add(defaultContextMenu_Item1);
ArxApp.AddDefaultContextMenuExtension(defaultContextMenu);
// ObjectContextMenu
ContextMenuExtension objContextMenu = new ContextMenuExtension();
objContextMenu.Title = " MyObjectContextMenu " ;
objContextMenu.Popup += new EventHandler(objContextMenu_Popup);
Autodesk.AutoCAD.Windows.MenuItem objContextMenu_Item1 = new Autodesk.AutoCAD.Windows.MenuItem( " Go to Baidu " , ARX.UI.Resources.Resource1.baidu);
objContextMenu_Item1.Click += new EventHandler(objContextMenu_Item1_Click);
objContextMenu.MenuItems.Add(objContextMenu_Item1);
Autodesk.AutoCAD.Windows.MenuItem objContextMenu_Item2 = new Autodesk.AutoCAD.Windows.MenuItem( " Go to Google " , ARX.UI.Resources.Resource1.google);
objContextMenu_Item2.Click += new EventHandler(objContextMenu_Item2_Click);
objContextMenu.MenuItems.Add(objContextMenu_Item2);
ArxApp.AddObjectContextMenuExtension(RXObject.GetClass( typeof (Polyline)), objContextMenu);
}
catch (System.Exception exc)
{
WriteLine( string .Format( " \n ContextMenu error: {0} " , exc.Message));
}
}
void objContextMenu_Popup( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
bool visible = true ;
// If that is multiple selection, disabled the menu item.
PromptSelectionResult selectionRes = ed.SelectImplied();
if (selectionRes.Status == PromptStatus.OK)
{
ObjectId[] objIds = selectionRes.Value.GetObjectIds();
if (objIds != null && objIds.Length > 1 )
{
visible = false ;
}
}
ContextMenuExtension objContextMenu = sender as ContextMenuExtension;
if (objContextMenu != null )
{
foreach (MenuItem item in objContextMenu.MenuItems)
{
item.Enabled = visible;
}
}
}
}
private void defaultContextMenu_OnClick( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
ArxApp.ShowAlertDialog( " defaultContextMenu_OnClick " );
}
}
void objContextMenu_Item1_Click( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
System.Diagnostics.Process.Start( " IEXPLORE.EXE " , " http://www.baidu.com " );
}
}
void objContextMenu_Item2_Click( object sender, EventArgs e)
{
using (DocumentLock docLock = ArxApp.DocumentManager.MdiActiveDocument.LockDocument())
{
System.Diagnostics.Process.Start( " IEXPLORE.EXE " , " http://www.google.com " );
}
}
#endregion
可以在 objContextMenu_Popup 事件中做一些逻辑处理。
下面是用到的namespace:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
using
Autodesk.AutoCAD.ApplicationServices;
using ArxApp = Autodesk.AutoCAD.ApplicationServices.Application;
using ArxDoc = Autodesk.AutoCAD.ApplicationServices.Document;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Windows;
using ArxApp = Autodesk.AutoCAD.ApplicationServices.Application;
using ArxDoc = Autodesk.AutoCAD.ApplicationServices.Document;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Windows;