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:
代码
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;