如何用C++开发菜单?
小弟是做二次开发的菜鸟,开发环境是:VC++6.0 + ObjectARX2002 。 最近正在做菜单这块,在ObjectARX2002的开发包中有个快捷菜单的例子,非常有用。但是现在我面临的问题是:要做主菜单,查看了ObjectARX的帮助文档,发现有个AcEdUIContext类,ObjectARX应用程序使用此类向AutoCAD快捷(环境)菜单中增加项。但是没有菜单类啊,是要从MFC的类库中继承一个类吗?但是,要是从MFC类库中继承的话,又如何实现和AutoCAD之间的通信呢?非常困扰啊~~~望各位大虾指点迷津,小弟在此感激不尽啊!!!最好能像开发包里面的sample一样,大虾们如果能给个例子,小弟就不胜感激了!!!
这个我有代码!
不过需要付一点点费用
QQ:444285140
这还付费啊。。。
需要导入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;
}
非常感谢楼上的这位大虾啊!!!实在感激不尽!!!眼泪哗哗的..... 其实菜单你可以修改菜单文件来着。
个人而言,菜单非常不建议用代码形式添加。
是修改.mnu文件吗? 修改mnu文件是一种方法,但2006以上使用的cui文件,比较难修改了。 转载论坛老师的源码,可以用在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]