明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4531|回复: 15

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

  [复制链接]
发表于 2005-3-9 22:37:00 | 显示全部楼层 |阅读模式
请各路高手指教,如何用MFC创建ObjectARX2005程序中的菜单
发表于 2005-3-10 10:35:00 | 显示全部楼层
好像是和VC中一样,我觉得你看看CAdUiDockControlBar 这个类,将你的菜单从这个类派生,应该不难实现
发表于 2005-3-10 11:30:00 | 显示全部楼层
为何一定要用 mfc??
发表于 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();
CMenu* pMenu = pAcadMain->GetMenu();
pMenu->InsertMenu(-1, MF_BYPOSITION, 0, "new") // 这些修改菜单的函数的具体用法可以自己参考VC++ Help,这一个是在主菜单最后的位置添加一个什么用也没有的'new'项目,项目下面也是什么都没有啦。。
pAcadMain->SetMenu(pMenu);
发表于 2005-3-11 08:18:00 | 显示全部楼层
在用OBJECTARX2005的WIZARD新建一个ARX项目后,添加菜单资源后,如何让菜单在ATUOCAD的主菜单上显示出来?就象在VC中一样添加消息和命令函数?我试过了,但没有可以添加的CLICK函数啊。
发表于 2005-3-11 14:17:00 | 显示全部楼层
lyhnjuct发表于2005-3-11 8:18:00在用OBJECTARX2005的WIZARD新建一个ARX项目后,添加菜单资源后,如何让菜单在ATUOCAD的主菜单上显示出来?就象在VC中一样添加消息和命令函数?

首先你要知道这种事情是不能用VC的图形界面直接做的..因为你没有AutoCAD的源代码..菜单资源只是模版, 本身不能对任何窗口进行任何修改, 相反, 是你指定一个特定窗口的菜单在生成的时候要用哪一个菜单资源. 所以, 第一你必须能够控制AutoCAD主窗口主菜单(得到控制的方法见偶上面的回贴), 第二你如果用菜单资源修改AutoCAD的菜单, 那是做不到'添加项目'的, 资源只能完全覆盖原有的菜单. '添加项目'只能通过写代码修改你得到的这个菜单控制来进行. 这些功能请参考VC++ MSDN Library里的CMenu项. AutoCAD的菜单文件有专门的格式, 要编辑主菜单, 直接用notepad编辑主菜单文件acad***\support\acad.mnu就可以..AutoCAD自己的customization guide里面专门有一章讲custom menu的..
发表于 2005-4-1 08:22:00 | 显示全部楼层
我试过了,pandoram说的不行,那个只能在AUTOCAD的界面上创建一个主菜单,而没有下拉菜单;我说的是加载自己的菜单资源,这个菜单资源有主菜单,并带有很多下拉菜单。
发表于 2005-4-1 10:07:00 | 显示全部楼层
我这里有段代码,不知对楼主有没有用: //添加菜单
void addMenuThroughCOM(void) { AutoCAD::IAcadApplication *pAcad;
HRESULT hr=NOERROR;
CLSID clsid;
LPUNKNOWN pUnk=NULL;
LPDISPATCH pAcadDisp=NULL;
hr=::CLSIDFromProgID(L"AutoCAD.Application",&clsid);
if (SUCCEEDED(hr))
{
if (::GetActiveObject (clsid,NULL,&pUnk)==S_OK)
{
if (pUnk->QueryInterface (IID_IDispatch,(LPVOID*)&pAcadDisp)
!=S_OK)
return;
pUnk->Release ();
}
}
if (SUCCEEDED(pAcadDisp->QueryInterface (AutoCAD::IID_IAcadApplication ,(void**)
&pAcad)))
pAcad->put_Visible(true);
else
{
acutPrintf("\n出错了!");
return;
}
AutoCAD::IAcadMenuBar *pMenuBar;
AutoCAD::IAcadMenuGroups *pMenuGroups;
pAcad->get_MenuBar(&pMenuBar);
pAcad->get_MenuGroups(&pMenuGroups);
pAcad->Release();
long numberOfMenus;
pMenuBar->get_Count (&numberOfMenus);
pMenuBar->Release ();
VARIANT index;
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
AutoCAD::IAcadMenuGroup *pMenuGroup;
pMenuGroups->Item (index,&pMenuGroup);
pMenuGroups->Release ();
AutoCAD::IAcadPopupMenus *pPopUpMenus;
pMenuGroup->get_Menus (&pPopUpMenus);
pMenuGroup->Release ();
if (!bIsMenuLoaded)
{
WCHAR wstrMenuName[256];
AutoCAD::IAcadPopupMenu *pPopUpMenu;
MultiByteToWideChar(CP_ACP,0,"毕业设计(&B)",-1,wstrMenuName,256);
pPopUpMenus->Add(wstrMenuName,&pPopUpMenu);
if (pPopUpMenu!=NULL)
{
//
//
AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;
WCHAR wstrMenuItemName[256],wstrMenuItemMacro[256];
//
//
MultiByteToWideChar(CP_ACP,0,"长方体(&C)",-1,wstrMenuItemName,256);
MultiByteToWideChar(CP_ACP,0,"frmbox ",-1,wstrMenuItemMacro,256);
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
pPopUpMenu->AddMenuItem (index,wstrMenuItemName,wstrMenuItemMacro,
&pPopUpMenuItem); //
//
MultiByteToWideChar(CP_ACP,0,"圆球体(&Y)",-1,wstrMenuItemName,256);
MultiByteToWideChar(CP_ACP,0,"frmsph ",-1,wstrMenuItemMacro,256);
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=1;
pPopUpMenu->AddMenuItem (index,wstrMenuItemName,wstrMenuItemMacro,
&pPopUpMenuItem);
//
// ///////////////////生成菜单
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=numberOfMenus-2;
pPopUpMenu->InsertInMenuBar (index);
pPopUpMenuItem->Release ();
bIsMenuLoaded=true;
}
else
{
acutPrintf("\n没有产生菜单!");
}
}
pPopUpMenus->Release ();
}
发表于 2005-4-1 14:40:00 | 显示全部楼层
回7楼:



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


你需要做的是像楼上提供的代码那样(*鞠躬, 致谢*), 用C++代码直接一个一个编辑菜单里面的条目, 直接为CAD加载VC++制作的菜单资源是不可行的..
发表于 2005-4-7 18:42:00 | 显示全部楼层

我就不信邪!

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


不相信!


CMENU的GETSUBMENU,APPENDMENU,LOADMENU,INSERTMENU,GETSUBMENU到底该怎么用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 06:30 , Processed in 0.168914 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表