如何用MFC创建ObjectARX2005程序中的菜单
请各路高手指教,如何用MFC创建ObjectARX2005程序中的菜单 好像是和VC中一样,我觉得你看看CAdUiDockControlBar 这个类,将你的菜单从这个类派生,应该不难实现 为何一定要用 mfc??你是想做什么地方的菜单啊?
偶猜你大概是觉得用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->GetMenu();<BR>pMenu->InsertMenu(-1, MF_BYPOSITION, 0, "new") // 这些修改菜单的函数的具体用法可以自己参考VC++ Help,这一个是在主菜单最后的位置添加一个什么用也没有的'new'项目,项目下面也是什么都没有啦。。<BR>pAcadMain->SetMenu(pMenu); 在用OBJECTARX2005的WIZARD新建一个ARX项目后,添加菜单资源后,如何让菜单在ATUOCAD的主菜单上显示出来?就象在VC中一样添加消息和命令函数?我试过了,但没有可以添加的CLICK函数啊。 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的.. 我试过了,pandoram说的不行,那个只能在AUTOCAD的界面上创建一个主菜单,而没有下拉菜单;我说的是加载自己的菜单资源,这个菜单资源有主菜单,并带有很多下拉菜单。 我这里有段代码,不知对楼主有没有用:
//添加菜单<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",&clsid);<BR> if (SUCCEEDED(hr))<BR> {<BR> if (::GetActiveObject (clsid,NULL,&pUnk)==S_OK)<BR> {<BR> if (pUnk->QueryInterface (IID_IDispatch,(LPVOID*)&pAcadDisp)<BR> !=S_OK)<BR> return;<BR> pUnk->Release ();<BR> }<BR> }<BR> if (SUCCEEDED(pAcadDisp->QueryInterface (AutoCAD::IID_IAcadApplication ,(void**)<BR> &pAcad)))<BR> pAcad->put_Visible(true);<BR> else<BR> {<BR> acutPrintf("\n出错了!");<BR> return;<BR> }<BR> AutoCAD::IAcadMenuBar *pMenuBar;<BR> AutoCAD::IAcadMenuGroups *pMenuGroups;<BR> pAcad->get_MenuBar(&pMenuBar);<BR> pAcad->get_MenuGroups(&pMenuGroups);<BR> pAcad->Release();<BR> long numberOfMenus;<BR> pMenuBar->get_Count (&numberOfMenus);<BR> pMenuBar->Release ();<BR> VARIANT index;<BR> VariantInit(&index);<BR> V_VT(&index)=VT_I4;<BR> V_I4(&index)=0;<BR> AutoCAD::IAcadMenuGroup *pMenuGroup;<BR> pMenuGroups->Item (index,&pMenuGroup);<BR> pMenuGroups->Release ();<BR> AutoCAD::IAcadPopupMenus *pPopUpMenus;<BR> pMenuGroup->get_Menus (&pPopUpMenus);<BR> pMenuGroup->Release ();<BR> if (!bIsMenuLoaded)<BR> {<BR> WCHAR wstrMenuName;<BR> AutoCAD::IAcadPopupMenu *pPopUpMenu;<BR> MultiByteToWideChar(CP_ACP,0,"毕业设计(&B)",-1,wstrMenuName,256);<BR> pPopUpMenus->Add(wstrMenuName,&pPopUpMenu);<BR> if (pPopUpMenu!=NULL)<BR> {<BR> //<BR> //<BR> AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;<BR> WCHAR wstrMenuItemName,wstrMenuItemMacro;<BR> //<BR> //<BR> MultiByteToWideChar(CP_ACP,0,"长方体(&C)",-1,wstrMenuItemName,256);<BR> MultiByteToWideChar(CP_ACP,0,"frmbox ",-1,wstrMenuItemMacro,256);<BR> VariantInit(&index);<BR> V_VT(&index)=VT_I4;<BR> V_I4(&index)=0;<BR> pPopUpMenu->AddMenuItem (index,wstrMenuItemName,wstrMenuItemMacro,<BR> &pPopUpMenuItem);
//<BR> //<BR> MultiByteToWideChar(CP_ACP,0,"圆球体(&Y)",-1,wstrMenuItemName,256);<BR> MultiByteToWideChar(CP_ACP,0,"frmsph ",-1,wstrMenuItemMacro,256);<BR> VariantInit(&index);<BR> V_VT(&index)=VT_I4;<BR> V_I4(&index)=1;<BR> pPopUpMenu->AddMenuItem (index,wstrMenuItemName,wstrMenuItemMacro,<BR> &pPopUpMenuItem);<BR> //<BR> //
///////////////////生成菜单<BR> VariantInit(&index);<BR> V_VT(&index)=VT_I4;<BR> V_I4(&index)=numberOfMenus-2;<BR> pPopUpMenu->InsertInMenuBar (index);<BR> pPopUpMenuItem->Release ();<BR> bIsMenuLoaded=true;<BR> }<BR> else<BR> {<BR> acutPrintf("\n没有产生菜单!");<BR> }<BR> }<BR> pPopUpMenus->Release ();<BR>} 回7楼:
...我说过了, 直接用菜单资源是不行的, 直接调用菜单资源只能完全覆盖CAD原有的主菜单. C++菜单资源和C++菜单是两种东西.
你需要做的是像楼上提供的代码那样(*鞠躬, 致谢*), 用C++代码直接一个一个编辑菜单里面的条目, 直接为CAD加载VC++制作的菜单资源是不可行的..
我就不信邪!
C++功能如此强大,还不能加载菜单资源到AUTOCAD中?不相信!
CMENU的GETSUBMENU,APPENDMENU,LOADMENU,INSERTMENU,GETSUBMENU到底该怎么用?
页:
[1]
2