动态创建右键快捷菜单
本帖最后由 橡皮 于 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) ;
}
效果如下:
居然是免费 的 太赞了
:lol谢谢分享,可惜CAD自身的右键菜单已经有些臃肿不堪 664571221 发表于 2025-12-8 08:46
如何使用啊兄弟....
兄弟,饭都已经喂到嘴里了 添加的代码为啥总是保存不上啊!!! 感谢分享 很有参考价值 谢谢楼主分享 楼主大气,免费分享,支持 右键的功能越来越多了,感谢分享 如何使用啊兄弟.... 感谢楼主分享,学习到了
页:
[1]
2