乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 117|回复: 8

如何用C++开发菜单?

[复制链接]

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

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

使用道具 举报

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2009-4-28 16:23:00 | 显示全部楼层
最好能像开发包里面的sample一样,大虾们如果能给个例子,小弟就不胜感激了!!!
回复

使用道具 举报

8

主题

21

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
53
发表于 2009-4-28 16:49:00 | 显示全部楼层
这个我有代码!
不过需要付一点点费用
QQ:444285140
回复

使用道具 举报

0

主题

38

帖子

1

银币

初来乍到

Rank: 1

铜币
38
发表于 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;
}
回复

使用道具 举报

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2009-5-5 11:09:00 | 显示全部楼层
非常感谢楼上的这位大虾啊!!!实在感激不尽!!!眼泪哗哗的.....
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2009-5-5 22:33:00 | 显示全部楼层
其实菜单你可以修改菜单文件来着。
个人而言,菜单非常不建议用代码形式添加。
回复

使用道具 举报

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2009-5-6 09:39:00 | 显示全部楼层
是修改.mnu文件吗?
回复

使用道具 举报

0

主题

38

帖子

1

银币

初来乍到

Rank: 1

铜币
38
发表于 2009-5-16 09:32:00 | 显示全部楼层
修改mnu文件是一种方法,但2006以上使用的cui文件,比较难修改了。
回复

使用道具 举报

2

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
12
发表于 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;
}
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 00:53 , Processed in 0.232117 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表