明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 38|回复: 2

动态创建右键快捷菜单

  [复制链接]
发表于 昨天 23:49 | 显示全部楼层 |阅读模式
本帖最后由 橡皮 于 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之后设置表格样式等。
创建过程如下(先通过项目模板创建项目):
  1. // 定义控件 ID ,可以通过添加 Menu 资源的形式创建(这里不进行演示)也可以动态创建 Menu 的形式创建
  2. #define IDC_ITEM_CreateCircle 1000
  3. #define IDC_ITEM_Message 1001
  4. #define IDC_ITEM_SetColor 1002

  5. class MyAcEdUIContext : public AcEdUIContext
  6. {
  7. public:
  8.   MyAcEdUIContext();
  9.   ~MyAcEdUIContext();

  10.   virtual void* getMenuContext(const AcRxClass* pClass, const AcDbObjectIdArray& ids);
  11.   virtual void onCommand(Adesk::UInt32 cmdIndex);
  12.   //virtual void OnUpdateMenu();

  13. private:
  14.   CMenu* m_pMenu;
  15.   HMENU    m_hMenu;
  16. };

  17. MyAcEdUIContext::MyAcEdUIContext()
  18. {
  19.   m_pMenu = new CMenu();
  20.   m_pMenu->CreatePopupMenu();
  21.   m_pMenu->AppendMenu(MF_STRING, IDC_ITEM_CreateCircle, _T("创建圆"));
  22.   m_pMenu->AppendMenu(MF_STRING, IDC_ITEM_Message, _T("Message"));
  23.   m_pMenu->AppendMenu(MF_STRING, IDC_ITEM_SetColor, _T("设置颜色"));
  24.   
  25. }

  26. MyAcEdUIContext::~MyAcEdUIContext()
  27. {
  28.   if (m_pMenu)
  29.   {
  30.     m_pMenu->DestroyMenu();
  31.     delete m_pMenu;
  32.   }
  33. }

  34. void* MyAcEdUIContext::getMenuContext(const AcRxClass* pClass, const AcDbObjectIdArray& ids)
  35. {
  36.   m_hMenu = m_pMenu->GetSafeHmenu();
  37.   return &m_hMenu;
  38. }

  39. void MyAcEdUIContext::onCommand(Adesk::UInt32 cmdIndex)
  40. {
  41.   switch (cmdIndex)
  42.   {
  43.   case IDC_ITEM_CreateCircle:
  44.     // 执行导入数据的操作
  45.     acutPrintf(_T("\nIDC_ITEM_CreateCircle\n"));
  46.     break;
  47.   case IDC_ITEM_Message:
  48.     // 执行导出数据的操作
  49.     AfxMessageBox(_T("\nIDC_ITEM_Message\n"));
  50.     break;
  51.   case IDC_ITEM_SetColor:
  52.     // 执行设置颜色的操作
  53.     acutPrintf(_T("\nIDC_ITEM_SetColor\n"));
  54.     break;
  55.   default:
  56.     break;
  57.   }
  58. }

使用过程如下:
  1. MyAcEdUIContext* pMyContextMenu = nullptr;
  2. MyAcEdUIContext* pObjMenu = nullptr;

  3.   // 创建
  4.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  5.     // TODO: Load dependencies here

  6.     // You *must* call On_kInitAppMsg here
  7.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  8.    
  9.     PrintCopyRightInfo();

  10.     pMyContextMenu = new MyAcEdUIContext();
  11.     auto rt = acedAddDefaultContextMenu(pMyContextMenu, pkt, _T("MenuDemo"));
  12.     if (rt == Adesk::kFalse)
  13.     {
  14.       delete pMyContextMenu;
  15.       pMyContextMenu = nullptr;
  16.     }

  17.     pObjMenu = new MyAcEdUIContext();
  18.     auto rt2 = acedAddObjectContextMenu(AcDbTable::desc(), pObjMenu, pkt);
  19.     if (rt2 == Adesk::kFalse)
  20.     {
  21.       delete pObjMenu;
  22.       pObjMenu = nullptr;
  23.     }

  24.     // TODO: Add your initialization code here

  25.     return (retCode) ;
  26.   }

  27.   // 卸载
  28.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  29.     // TODO: Add your code here
  30.     if (pMyContextMenu)
  31.     {
  32.       acedRemoveDefaultContextMenu(pMyContextMenu);
  33.       delete pMyContextMenu;
  34.     }

  35.     if (pObjMenu)
  36.     {
  37.       acedRemoveObjectContextMenu(AcDbTable::desc(), pObjMenu);
  38.       delete pObjMenu;
  39.     }

  40.     // You *must* call On_kUnloadAppMsg here
  41.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

  42.     // TODO: Unload dependencies here

  43.     return (retCode) ;
  44.   }

效果如下:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 昨天 23:51 | 显示全部楼层
添加的代码为啥总是保存不上啊!!!
回复 支持 反对

使用道具 举报

发表于 6 小时前 | 显示全部楼层
谢谢分享,可惜CAD自身的右键菜单已经有些臃肿不堪
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-12-6 06:46 , Processed in 0.179941 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表