apple06 发表于 2005-3-9 22:37:00

如何用MFC创建ObjectARX2005程序中的菜单

请各路高手指教,如何用MFC创建ObjectARX2005程序中的菜单

JA_JERRY 发表于 2005-3-10 10:35:00

好像是和VC中一样,我觉得你看看CAdUiDockControlBar 这个类,将你的菜单从这个类派生,应该不难实现

easypower 发表于 2005-3-10 11:30:00

为何一定要用 mfc??

pandoram 发表于 2005-3-10 15:39:00

你是想做什么地方的菜单啊?

偶猜你大概是觉得用MFC的图形界面做菜单比较直观吧:))



如果是ARX程序本身呼叫的对话框的菜单,直接创建MFC菜单资源和CAcUiDialog对话框(或者普通CDialog都可以),然后在对话框property里指定使用这个菜单资源就可以了。。


如果是AutoCAD的主菜单,用MFC是无法直接调出来图形界面修改的,AutoCAD的主菜单修改直接改.mnu文件就好了,可以参考AutoCAD Help的Customization Guide。。


但是如果你真的要用MFC做的话,差不多是这样。。设一个窗口指针一个菜单指针,用acedGetAcadFrame()之类的命令得到控制AutoCAD的主窗口的一个CMDIFrameWnd指针,然后用这个指针抓取主菜单(GetMenu),然后修改菜单,再SetMenu回去到窗口里面。。


大概的code是这样吧:


CAcModuleResourceOverride res; // 避免资源冲突。。


CMDIFrameWnd* pAcadMain = acedGetAcadFrame();<BR>CMenu* pMenu = pAcadMain-&gt;GetMenu();<BR>pMenu-&gt;InsertMenu(-1, MF_BYPOSITION, 0, "new") // 这些修改菜单的函数的具体用法可以自己参考VC++ Help,这一个是在主菜单最后的位置添加一个什么用也没有的'new'项目,项目下面也是什么都没有啦。。<BR>pAcadMain-&gt;SetMenu(pMenu);

lyhnjuct 发表于 2005-3-11 08:18:00

在用OBJECTARX2005的WIZARD新建一个ARX项目后,添加菜单资源后,如何让菜单在ATUOCAD的主菜单上显示出来?就象在VC中一样添加消息和命令函数?我试过了,但没有可以添加的CLICK函数啊。

pandoram 发表于 2005-3-11 14:17:00

lyhnjuct发表于2005-3-11 8:18:00static/image/common/back.gif在用OBJECTARX2005的WIZARD新建一个ARX项目后,添加菜单资源后,如何让菜单在ATUOCAD的主菜单上显示出来?就象在VC中一样添加消息和命令函数?


<BR>首先你要知道这种事情是不能用VC的图形界面直接做的..因为你没有AutoCAD的源代码..菜单资源只是模版, 本身不能对任何窗口进行任何修改, 相反, 是你指定一个特定窗口的菜单在生成的时候要用哪一个菜单资源. 所以, 第一你必须能够控制AutoCAD主窗口主菜单(得到控制的方法见偶上面的回贴), 第二你如果用菜单资源修改AutoCAD的菜单, 那是做不到'添加项目'的, 资源只能完全覆盖原有的菜单. '添加项目'只能通过写代码修改你得到的这个菜单控制来进行. 这些功能请参考VC++ MSDN Library里的CMenu项.


AutoCAD的菜单文件有专门的格式, 要编辑主菜单, 直接用notepad编辑主菜单文件acad***\support\acad.mnu就可以..AutoCAD自己的customization guide里面专门有一章讲custom menu的..

lyhnjuct 发表于 2005-4-1 08:22:00

我试过了,pandoram说的不行,那个只能在AUTOCAD的界面上创建一个主菜单,而没有下拉菜单;我说的是加载自己的菜单资源,这个菜单资源有主菜单,并带有很多下拉菜单。

我的ARX 发表于 2005-4-1 10:07:00

我这里有段代码,不知对楼主有没有用:


//添加菜单<BR>void addMenuThroughCOM(void)


{


AutoCAD::IAcadApplication *pAcad;<BR>        HRESULT hr=NOERROR;<BR>        CLSID clsid;<BR>        LPUNKNOWN pUnk=NULL;<BR>        LPDISPATCH pAcadDisp=NULL;<BR>        hr=::CLSIDFromProgID(L"AutoCAD.Application",&amp;clsid);<BR>        if (SUCCEEDED(hr))<BR>        {<BR>                if (::GetActiveObject (clsid,NULL,&amp;pUnk)==S_OK)<BR>                {<BR>                        if (pUnk-&gt;QueryInterface (IID_IDispatch,(LPVOID*)&amp;pAcadDisp)<BR>                                !=S_OK)<BR>                                return;<BR>                        pUnk-&gt;Release ();<BR>                }<BR>        }<BR>        if (SUCCEEDED(pAcadDisp-&gt;QueryInterface (AutoCAD::IID_IAcadApplication ,(void**)<BR>                &amp;pAcad)))<BR>                pAcad-&gt;put_Visible(true);<BR>        else<BR>        {<BR>                acutPrintf("\n出错了!");<BR>                return;<BR>        }<BR>        AutoCAD::IAcadMenuBar *pMenuBar;<BR>        AutoCAD::IAcadMenuGroups *pMenuGroups;<BR>        pAcad-&gt;get_MenuBar(&amp;pMenuBar);<BR>        pAcad-&gt;get_MenuGroups(&amp;pMenuGroups);<BR>        pAcad-&gt;Release();<BR>        long numberOfMenus;<BR>        pMenuBar-&gt;get_Count (&amp;numberOfMenus);<BR>        pMenuBar-&gt;Release ();<BR>        VARIANT index;<BR>        VariantInit(&amp;index);<BR>        V_VT(&amp;index)=VT_I4;<BR>        V_I4(&amp;index)=0;<BR>        AutoCAD::IAcadMenuGroup *pMenuGroup;<BR>        pMenuGroups-&gt;Item (index,&amp;pMenuGroup);<BR>        pMenuGroups-&gt;Release ();<BR>        AutoCAD::IAcadPopupMenus *pPopUpMenus;<BR>        pMenuGroup-&gt;get_Menus (&amp;pPopUpMenus);<BR>        pMenuGroup-&gt;Release ();<BR>        if (!bIsMenuLoaded)<BR>        {<BR>                WCHAR wstrMenuName;<BR>                AutoCAD::IAcadPopupMenu *pPopUpMenu;<BR>                MultiByteToWideChar(CP_ACP,0,"毕业设计(&amp;B)",-1,wstrMenuName,256);<BR>                pPopUpMenus-&gt;Add(wstrMenuName,&amp;pPopUpMenu);<BR>                if (pPopUpMenu!=NULL)<BR>                {<BR>                        //<BR>                        //<BR>                        AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;<BR>                        WCHAR wstrMenuItemName,wstrMenuItemMacro;<BR>                        //<BR>                        //<BR>                        MultiByteToWideChar(CP_ACP,0,"长方体(&amp;C)",-1,wstrMenuItemName,256);<BR>                        MultiByteToWideChar(CP_ACP,0,"frmbox ",-1,wstrMenuItemMacro,256);<BR>                        VariantInit(&amp;index);<BR>                        V_VT(&amp;index)=VT_I4;<BR>                        V_I4(&amp;index)=0;<BR>                        pPopUpMenu-&gt;AddMenuItem (index,wstrMenuItemName,wstrMenuItemMacro,<BR>                                &amp;pPopUpMenuItem);


//<BR>                        //<BR>                        MultiByteToWideChar(CP_ACP,0,"圆球体(&amp;Y)",-1,wstrMenuItemName,256);<BR>                        MultiByteToWideChar(CP_ACP,0,"frmsph ",-1,wstrMenuItemMacro,256);<BR>                        VariantInit(&amp;index);<BR>                        V_VT(&amp;index)=VT_I4;<BR>                        V_I4(&amp;index)=1;<BR>                        pPopUpMenu-&gt;AddMenuItem (index,wstrMenuItemName,wstrMenuItemMacro,<BR>                                &amp;pPopUpMenuItem);<BR>                        //<BR>                        //


///////////////////生成菜单<BR>                        VariantInit(&amp;index);<BR>                        V_VT(&amp;index)=VT_I4;<BR>                        V_I4(&amp;index)=numberOfMenus-2;<BR>                        pPopUpMenu-&gt;InsertInMenuBar (index);<BR>                        pPopUpMenuItem-&gt;Release ();<BR>                        bIsMenuLoaded=true;<BR>                }<BR>                else<BR>                {<BR>                        acutPrintf("\n没有产生菜单!");<BR>                }<BR>        }<BR>        pPopUpMenus-&gt;Release ();<BR>}

pandoram 发表于 2005-4-1 14:40:00

回7楼:



...我说过了, 直接用菜单资源是不行的, 直接调用菜单资源只能完全覆盖CAD原有的主菜单. C++菜单资源和C++菜单是两种东西.


你需要做的是像楼上提供的代码那样(*鞠躬, 致谢*), 用C++代码直接一个一个编辑菜单里面的条目, 直接为CAD加载VC++制作的菜单资源是不可行的..

lyhnjuct 发表于 2005-4-7 18:42:00

我就不信邪!

C++功能如此强大,还不能加载菜单资源到AUTOCAD中?


不相信!


CMENU的GETSUBMENU,APPENDMENU,LOADMENU,INSERTMENU,GETSUBMENU到底该怎么用?
页: [1] 2
查看完整版本: 如何用MFC创建ObjectARX2005程序中的菜单