本帖最后由 橡皮 于 2025-12-6 00:03 编辑
右键菜单分两种:
1. acedAddDefaultContextMenu(
AcEdUIContext * pContext, const void * appId, const ACHAR* appName = NULL
);添加默认模式快捷菜单,如CAD中的平移、缩放和快速选择等;
2. Adesk::Boolean acedAddObjectContextMenu(
AcRxClass * pClass, AcEdUIContext * pContext, const void * appId);为给定的类添加编辑模式快捷菜单,如选中多段线之后的添加交点,选择Table之后设置表格样式等。
创建过程如下(先通过项目模板创建项目):
 - // 定义控件 ID ,可以通过添加 Menu 资源的形式创建(这里不进行演示)也可以动态创建 Menu 的形式创建
- #define IDC_ITEM_CreateCircle 1000
- #define IDC_ITEM_Message 1001
- #define IDC_ITEM_SetColor 1002
- class MyAcEdUIContext : public AcEdUIContext
- {
- public:
- MyAcEdUIContext();
- ~MyAcEdUIContext();
- virtual void* getMenuContext(const AcRxClass* pClass, const AcDbObjectIdArray& ids);
- virtual void onCommand(Adesk::UInt32 cmdIndex);
- //virtual void OnUpdateMenu();
- private:
- CMenu* m_pMenu;
- HMENU m_hMenu;
- };
- MyAcEdUIContext::MyAcEdUIContext()
- {
- m_pMenu = new CMenu();
- m_pMenu->CreatePopupMenu();
- m_pMenu->AppendMenu(MF_STRING, IDC_ITEM_CreateCircle, _T("创建圆"));
- m_pMenu->AppendMenu(MF_STRING, IDC_ITEM_Message, _T("Message"));
- m_pMenu->AppendMenu(MF_STRING, IDC_ITEM_SetColor, _T("设置颜色"));
-
- }
- MyAcEdUIContext::~MyAcEdUIContext()
- {
- if (m_pMenu)
- {
- m_pMenu->DestroyMenu();
- delete m_pMenu;
- }
- }
- void* MyAcEdUIContext::getMenuContext(const AcRxClass* pClass, const AcDbObjectIdArray& ids)
- {
- m_hMenu = m_pMenu->GetSafeHmenu();
- return &m_hMenu;
- }
- void MyAcEdUIContext::onCommand(Adesk::UInt32 cmdIndex)
- {
- switch (cmdIndex)
- {
- case IDC_ITEM_CreateCircle:
- // 执行导入数据的操作
- acutPrintf(_T("\nIDC_ITEM_CreateCircle\n"));
- break;
- case IDC_ITEM_Message:
- // 执行导出数据的操作
- AfxMessageBox(_T("\nIDC_ITEM_Message\n"));
- break;
- case IDC_ITEM_SetColor:
- // 执行设置颜色的操作
- acutPrintf(_T("\nIDC_ITEM_SetColor\n"));
- break;
- default:
- break;
- }
- }
使用过程如下:
 - MyAcEdUIContext* pMyContextMenu = nullptr;
- MyAcEdUIContext* pObjMenu = nullptr;
- // 创建
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- // TODO: Load dependencies here
- // You *must* call On_kInitAppMsg here
- AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
-
- PrintCopyRightInfo();
- pMyContextMenu = new MyAcEdUIContext();
- auto rt = acedAddDefaultContextMenu(pMyContextMenu, pkt, _T("MenuDemo"));
- if (rt == Adesk::kFalse)
- {
- delete pMyContextMenu;
- pMyContextMenu = nullptr;
- }
- pObjMenu = new MyAcEdUIContext();
- auto rt2 = acedAddObjectContextMenu(AcDbTable::desc(), pObjMenu, pkt);
- if (rt2 == Adesk::kFalse)
- {
- delete pObjMenu;
- pObjMenu = nullptr;
- }
- // TODO: Add your initialization code here
- return (retCode) ;
- }
- // 卸载
- virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
- // TODO: Add your code here
- if (pMyContextMenu)
- {
- acedRemoveDefaultContextMenu(pMyContextMenu);
- delete pMyContextMenu;
- }
- if (pObjMenu)
- {
- acedRemoveObjectContextMenu(AcDbTable::desc(), pObjMenu);
- delete pObjMenu;
- }
- // You *must* call On_kUnloadAppMsg here
- AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
- // TODO: Unload dependencies here
- return (retCode) ;
- }
效果如下:
|