如何用C++开发菜单?
<p> <font size="4"></font><font size="3">小弟是做AutoCAD二次开发的菜鸟,开发环境是:VC++6.0 + ObjectARX2002 。 最近正在做菜单这块,在ObjectARX2002的开发包中有个快捷菜单的例子,非常有用。但是现在我面临的问题是:要做主菜单,查看了ObjectARX的帮助文档,发现有个<span class="h1overlay"><span lang="EN-US" style="FONT-SIZE: 14pt;"><font color="#ffffff" style="BACKGROUND-COLOR: #3399fe;"><strong>AcEdUIContext</strong></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><strong>类,</strong><span class="SpellE"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman';">ObjectARX</span>应用程序使用此类向AutoCAD快捷(环境)菜单中增加项。但是没有菜单类啊,是要从MFC的类库中继承一个类吗?但是,要是从MFC类库中继承的话,又如何实现和AutoCAD之间的通信呢?非常困扰啊~~~望各位大虾指点迷津,小弟在此感激不尽啊!!!</span></span></font></p><p></p> <p>最好能像开发包里面的sample一样,大虾们如果能给个例子,小弟就不胜感激了!!!</p> <p>这个我有代码! </p><p>不过需要付一点点费用</p><p></p><p>QQ:444285140</p> <p>这还付费啊。。。</p><p>需要导入acad.tlb来导入Com接口</p><p>void CreateMenuItem()<br/>{<br/> TRY<br/> {<br/> IAcadApplication IAcad(acedGetAcadWinApp()->GetIDispatch(TRUE));</p><p> IAcadMenuBar IMenuBar(IAcad.GetMenuBar());</p><p> long numberOfMenus;<br/> numberOfMenus = IMenuBar.GetCount();</p><p> IAcadMenuGroups IMenuGroups(IAcad.GetMenuGroups());</p><p> VARIANT index;<br/> VariantInit(&index);<br/> V_VT(&index) = VT_I4;<br/> V_I4(&index) = 0;</p><p> IAcadMenuGroup IMenuGroup(IMenuGroups.Item(index));</p><p> IAcadPopupMenus IPopUpMenus(IMenuGroup.GetMenus());</p><p> CString cstrMenuName = _T("MyMenu");</p><p> VariantInit(&index);<br/> V_VT(&index) = VT_BSTR;<br/> V_BSTR(&index) = cstrMenuName.AllocSysString();</p><p> IDispatch* pDisp=NULL;</p><p> //see if the menu is already there<br/> TRY<br/> {<br/> pDisp = IPopUpMenus.Item(index);<br/> pDisp->AddRef();<br/> }<br/> CATCH(COleDispatchException,e)<br/> {}<br/> END_CATCH;</p><p> int iIndex = 0;<br/> if (pDisp==NULL)<br/> {<br/> //create it<br/> IAcadPopupMenu IPopUpMenu(IPopUpMenus.Add(cstrMenuName));</p><p> VariantInit(&index);<br/> V_VT(&index) = VT_I4;<br/> V_I4(&index) = iIndex++;<br/> IPopUpMenu.AddMenuItem(index, _T("测试(&T)"), _T("_TestCmd "));</p><p><br/> pDisp = IPopUpMenu.m_lpDispatch;<br/> pDisp->AddRef();<br/> }</p><p> IAcadPopupMenu IPopUpMenu(pDisp);<br/> if (!IPopUpMenu.GetOnMenuBar())<br/> {<br/> VariantInit(&index);<br/> V_VT(&index) = VT_I4;<br/> V_I4(&index) = numberOfMenus - 2;;<br/> IPopUpMenu.InsertInMenuBar(index);<br/> }<br/> else<br/> {<br/> VariantInit(&index);<br/> V_VT(&index) = VT_BSTR;<br/> V_BSTR(&index) = cstrMenuName.AllocSysString();<br/> IPopUpMenus.RemoveMenuFromMenuBar(index);<br/> VariantClear(&index);<br/> }<br/> pDisp->Release();<br/> }<br/> CATCH(COleDispatchException,e)<br/> {<br/> e->ReportError();<br/> e->Delete();<br/> }<br/> END_CATCH;<br/>}</p> 非常感谢楼上的这位大虾啊!!!实在感激不尽!!!眼泪哗哗的..... 其实菜单你可以修改菜单文件来着。<br/><br/>个人而言,菜单非常不建议用代码形式添加。<br/> 是修改.mnu文件吗? 修改mnu文件是一种方法,但2006以上使用的cui文件,比较难修改了。 <p>转载论坛老师的源码,可以用在2006版本以上共同借鉴,希望老师不要介意,如果不允许,我会道歉</p><p>//加载局部菜单<br/>bool LoadPartialMenu(<br/> const char* filePath //局部菜单文件名<br/> , const char* menuGroupName //局部菜单组名<br/> )<br/>{<br/> resbuf pSrcRb;<br/> resbuf* pDestRb = NULL; <br/> if (acedGetVar("FILEDIA", &pSrcRb) != RTNORM) return false;<br/> if ((pDestRb = acutBuildList(RTSHORT, 0, RTNONE)) == NULL) return false;<br/> <br/> //不显示对话框,改为命令行<br/> if (acedSetVar("FILEDIA", pDestRb) != RTNORM) {<br/> acutRelRb(pDestRb);<br/> return false;<br/> }<br/> acutRelRb(pDestRb);<br/> //加载菜单<br/> if (acedCommand(RTSTR, "menuload", RTSTR, filePath, 0) != RTNORM) {<br/> acedSetVar("FILEDIA", &pSrcRb);<br/> return false;<br/> }<br/> //加载局部菜单完毕,恢复原始状态<br/> acedSetVar("FILEDIA", &pSrcRb);<br/> <br/> //显示局部菜单<br/> char menuCmd; <br/> sprintf(menuCmd, "GACAD.HELP=+%s.POP%d", menuGroupName,13);<br/> acedMenuCmd(menuCmd);<br/> sprintf(menuCmd, "GACAD.HELP=+%s.POP%d", menuGroupName,14);<br/> acedMenuCmd(menuCmd);<br/> return true;<br/>}<br/></p>
页:
[1]