【原创】ObjectARX SDK samples Contextmenu 实例学习笔记

本实例主要是描述如何用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);
}

posted @ 2013-04-14 13:09  编号一百零二  阅读(1001)  评论(0编辑  收藏  举报