明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2854|回复: 8

如何用C++开发菜单?

[复制链接]
发表于 2009-4-28 16:21:00 | 显示全部楼层 |阅读模式

     小弟是做AutoCAD二次开发的菜鸟,开发环境是:VC++6.0   +   ObjectARX2002 。 最近正在做菜单这块,在ObjectARX2002的开发包中有个快捷菜单的例子,非常有用。但是现在我面临的问题是:要做主菜单,查看了ObjectARX的帮助文档,发现有个AcEdUIContext类,ObjectARX应用程序使用此类向AutoCAD快捷(环境)菜单中增加项。但是没有菜单类啊,是要从MFC的类库中继承一个类吗?但是,要是从MFC类库中继承的话,又如何实现和AutoCAD之间的通信呢?非常困扰啊~~~望各位大虾指点迷津,小弟在此感激不尽啊!!!

 楼主| 发表于 2009-4-28 16:23:00 | 显示全部楼层

最好能像开发包里面的sample一样,大虾们如果能给个例子,小弟就不胜感激了!!!

发表于 2009-4-28 16:49:00 | 显示全部楼层

这个我有代码!

不过需要付一点点费用

QQ:444285140

发表于 2009-5-4 22:43:00 | 显示全部楼层

这还付费啊。。。

需要导入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;
}

 楼主| 发表于 2009-5-5 11:09:00 | 显示全部楼层
非常感谢楼上的这位大虾啊!!!实在感激不尽!!!眼泪哗哗的.....
发表于 2009-5-5 22:33:00 | 显示全部楼层
其实菜单你可以修改菜单文件来着。

个人而言,菜单非常不建议用代码形式添加。
 楼主| 发表于 2009-5-6 09:39:00 | 显示全部楼层
是修改.mnu文件吗?
发表于 2009-5-16 09:32:00 | 显示全部楼层
修改mnu文件是一种方法,但2006以上使用的cui文件,比较难修改了。
发表于 2009-5-24 12:36:00 | 显示全部楼层

转载论坛老师的源码,可以用在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[512]; 
 sprintf(menuCmd, "GACAD.HELP=+%s.POP%d", menuGroupName,13);
 acedMenuCmd(menuCmd);
 sprintf(menuCmd, "GACAD.HELP=+%s.POP%d", menuGroupName,14);
 acedMenuCmd(menuCmd);
 return true;
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:22 , Processed in 0.302419 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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