本实例主要是描述如何用ARX定制CAD的右键菜单,CAD的右键菜单可以分为很多类,但没有选中实体时
的菜单只有一类(defaultContextMenu),然而你可以为每一个实体类型定义一个右键菜单类型。整个
CAD中针对每个类(objectContextMenu)的处理方法都是这样的,类似于扩展协议一样,如果每一类实
体没有自己定义扩展协议,则按CAD默认的处理方法。ContextMenu主要包括的就是
defaultContextMenu 和 objectContextMenu,在我们软件中,也用到了这个类型,主要的核心就是,
你必须继承一个父类,并且实现三个方法:
AcEdUIContext类,并且实现以下三个方法。
virtual void* getMenuContext(const AcRxClass *pClass, const AcDbObjectIdArray& ids) ;
virtual void onCommand(Adesk::UInt32 cmdIndex);
virtual void OnUpdateMenu();
其中 getMenuContext()和onUpdateMenu()这两个函数是CAD本身自己调用的。onCommand是单击了右键
之后,选择了其中一项后,再执行的,在这里,你可以对不同项进行不同的操作。
在getMenuContext()函数中,返回你所要弹出的的菜单句柄,每次右键都会调用
在onUpDateMenu()函数中,更新你的菜单,每次右键都会调用。
执行了单击右键菜单中的某一项之后,就会调用onCommand()函数,以便开发人员能做一些处理。
在CAD里注册和注销右键菜单,主要使用这四个接口
Adesk::Boolean acedAddObjectContextMenu(const AcRxClass *pClass,
AcEdUIContext *pContext,
const void *appId);
Adesk::Boolean acedRemoveObjectContextMenu(const AcRxClass *pClass,
AcEdUIContext *pContext);
Adesk::Boolean acedAddDefaultContextMenu(AcEdUIContext *pContext,
const void *appId,
const ACHAR* appName=NULL);
Adesk::Boolean acedRemoveDefaultContextMenu(AcEdUIContext *pContext);
默认菜单,是不区分类别的,调用方法如下:
UeDefaultMenu* pDefaultMenu = new UeDefaultMenu;
acedAddDefaultContextMenu(pDefaultMenu, pAppID); 注册
acedRemoveDefaultContextMenu(pDefaultMenu); 注销
Object菜单是区分类别的,调用方法如下:
UeCircleMenu* pCircleMenu = new UeCircleMenu;
UeLineMenu* pLineMenu = new UeLineMenu;
acedAddObjectContextMenu(AcDbCircle::desc(),pCircleMenu, pAppID);
acedRemoveObjectContextMenu(AcDbCircle::desc(),pCircleMenu);
acedAddObjectContextMenu(AcDbLine::desc(),pLineMenu, pAppID)
acedRemoveObjectContextMenu(AcDbLine::desc(),pLineMenu);
还有在注册和注销菜单操作的时候,一定要注意资源切换
Load() //一般在ARX加载时进行
{
acDocManager->pushResourceHandle(_hdllInstance);
//dosomething for menu
acDocManager->popResourceHandle();
}
Unload() //一般在ARX卸载时进行
{
HINSTANCE hInst = AfxGetResourceHandle();
AfxSetResourceHandle(_hdllInstance);
//dosomething for menu
AfxSetResourceHandle(hInst);
}