liubo4869 发表于 2009-4-28 16:21:00

如何用C++开发菜单?

小弟是做二次开发的菜鸟,开发环境是:VC++6.0   +   ObjectARX2002 。 最近正在做菜单这块,在ObjectARX2002的开发包中有个快捷菜单的例子,非常有用。但是现在我面临的问题是:要做主菜单,查看了ObjectARX的帮助文档,发现有个AcEdUIContext类,ObjectARX应用程序使用此类向AutoCAD快捷(环境)菜单中增加项。但是没有菜单类啊,是要从MFC的类库中继承一个类吗?但是,要是从MFC类库中继承的话,又如何实现和AutoCAD之间的通信呢?非常困扰啊~~~望各位大虾指点迷津,小弟在此感激不尽啊!!!

liubo4869 发表于 2009-4-28 16:23:00

最好能像开发包里面的sample一样,大虾们如果能给个例子,小弟就不胜感激了!!!

etongsoft 发表于 2009-4-28 16:49:00

这个我有代码!
不过需要付一点点费用
QQ:444285140

松竹 发表于 2009-5-4 22:43:00

这还付费啊。。。
需要导入acad.tlb来导入Com接口
void CreateMenuItem()
{
TRY
{
IAcadApplication IAcad(acedGetAcadWinApp()->GetIDispatch(TRUE));
IAcadMenuBar IMenuBar(IAcad.GetMenuBar());
long numberOfMenus;
numberOfMenus = IMenuBar.GetCount();
IAcadMenuGroups IMenuGroups(IAcad.GetMenuGroups());
VARIANT index;
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
IAcadMenuGroup IMenuGroup(IMenuGroups.Item(index));
IAcadPopupMenus IPopUpMenus(IMenuGroup.GetMenus());
CString cstrMenuName = _T("MyMenu");
VariantInit(&index);
V_VT(&index) = VT_BSTR;
V_BSTR(&index) = cstrMenuName.AllocSysString();
IDispatch* pDisp=NULL;
//see if the menu is already there
TRY
{
   pDisp = IPopUpMenus.Item(index);
   pDisp->AddRef();
}
CATCH(COleDispatchException,e)
{}
END_CATCH;
int iIndex = 0;
if (pDisp==NULL)
{
   //create it
   IAcadPopupMenu IPopUpMenu(IPopUpMenus.Add(cstrMenuName));
   VariantInit(&index);
   V_VT(&index) = VT_I4;
   V_I4(&index) = iIndex++;
   IPopUpMenu.AddMenuItem(index, _T("测试(&T)"), _T("_TestCmd "));
   pDisp = IPopUpMenu.m_lpDispatch;
   pDisp->AddRef();
}
IAcadPopupMenu IPopUpMenu(pDisp);
if (!IPopUpMenu.GetOnMenuBar())
{
   VariantInit(&index);
   V_VT(&index) = VT_I4;
   V_I4(&index) = numberOfMenus - 2;;
   IPopUpMenu.InsertInMenuBar(index);
}
else
{
   VariantInit(&index);
   V_VT(&index) = VT_BSTR;
   V_BSTR(&index) = cstrMenuName.AllocSysString();
   IPopUpMenus.RemoveMenuFromMenuBar(index);
   VariantClear(&index);
}
pDisp->Release();
}
CATCH(COleDispatchException,e)
{
e->ReportError();
e->Delete();
}
END_CATCH;
}

liubo4869 发表于 2009-5-5 11:09:00

非常感谢楼上的这位大虾啊!!!实在感激不尽!!!眼泪哗哗的.....

GGxMM 发表于 2009-5-5 22:33:00

其实菜单你可以修改菜单文件来着。
个人而言,菜单非常不建议用代码形式添加。

liubo4869 发表于 2009-5-6 09:39:00

是修改.mnu文件吗?

松竹 发表于 2009-5-16 09:32:00

修改mnu文件是一种方法,但2006以上使用的cui文件,比较难修改了。

zyx137 发表于 2009-5-24 12:36:00

转载论坛老师的源码,可以用在2006版本以上共同借鉴,希望老师不要介意,如果不允许,我会道歉
//加载局部菜单
bool LoadPartialMenu(
      const char* filePath //局部菜单文件名
      , const char* menuGroupName //局部菜单组名
      )
{
resbuf pSrcRb;
resbuf* pDestRb = NULL;
if (acedGetVar("FILEDIA", &pSrcRb) != RTNORM) return false;
if ((pDestRb = acutBuildList(RTSHORT, 0, RTNONE)) == NULL) return false;

//不显示对话框,改为命令行
if (acedSetVar("FILEDIA", pDestRb) != RTNORM) {
acutRelRb(pDestRb);
return false;
}
acutRelRb(pDestRb);
//加载菜单
if (acedCommand(RTSTR, "menuload", RTSTR, filePath, 0) != RTNORM) {
acedSetVar("FILEDIA", &pSrcRb);
return false;
}
//加载局部菜单完毕,恢复原始状态
acedSetVar("FILEDIA", &pSrcRb);

//显示局部菜单
char menuCmd;
sprintf(menuCmd, "GACAD.HELP=+%s.POP%d", menuGroupName,13);
acedMenuCmd(menuCmd);
sprintf(menuCmd, "GACAD.HELP=+%s.POP%d", menuGroupName,14);
acedMenuCmd(menuCmd);
return true;
}
页: [1]
查看完整版本: 如何用C++开发菜单?