利用MFC动态向AutoCAD的菜单栏添加菜单

利用MFC动态向AutoCAD的菜单栏添加菜单

      菜单 it  分类:ObjectARX编程
前面我们介绍过在ObjectARX中通过Com接口向AutoCAD的菜单栏追加菜单,今天我们再提供另外的两种方法,利用Windows窗体的机制直接向AutoCAD主菜单上添加菜单。
(1)在ARX程序的InitApplication函数中,动态创建一个新菜单,将其添加到AutoCAD的主菜单上去:
acedGetAcadFrame()->m_bAutoMenuEnable = FALSE;
 CMenu *pMainMenu = acedGetAcadFrame()->GetMenu();
 CMenu myMenu;
 myMenu.CreatePopupMenu();
 myMenu.AppendMenu(MF_STRING, IDM_MYMENU_ITEM1, TEXT("Line"));
 pMainMenu->AppendMenu(MF_POPUP, (UINT)myMenu.Detach(), TEXT("Test"));
 acedGetAcadFrame()->DrawMenuBar();
注意第一句代码,如果没有这句代码,你的菜单仍然能够显示出来,但是会处于灰色无法点击的状态,这是MFC内部对菜单可用状态提供的一种判断机制;
(2)为了在ARX程序中处理菜单消息,必须使用Hook技术。定义一个全局变量用于判断是否已经注册了钩子函数:
bool bRegistered = false;
(3)在InitApplication函数中注册钩子函数:
if (!acedRegisterFilterWinMsg(GetMousePos))
 {
  acedPrompt("无法注册钩子函数:GetMousePos/n");
 }
 else
 {
  bRegistered = true;
 }
(4)在UnloadApplication函数中取消钩子函数的注册:
if (bRegistered)
 {
  acedRemoveFilterWinMsg(GetMousePos);
  bRegistered = FALSE;
 }
(5)钩子函数实际上就是一个全局函数,在这里面我们将会WM_COMMAND消息进行处理,其中IDM_MYMENU_ITEM1是我在Resource.h中为新的菜单项定义的一个ID:
BOOL GetMousePos(MSG *pMsg)
{
 CPoint cPnt;
 acedDwgPoint cpt;
 switch (pMsg->message)
 {
 case WM_COMMAND:
  {
   if (LOWORD(pMsg->wParam) == IDM_MYMENU_ITEM1)
   {
    acDocManager->sendStringToExecute(acDocManager->curDocument(), TEXT("Line
"));
    return TRUE;
   }
  }
 
  break;
 }
 return FALSE;
}
(6)现在已经万事大吉,可以运行你的程序看效果了。
如果是预先在ARX程序中编写菜单资源,然后通过这种方式加载,也是一样的道理,只不过菜单的来源不同,消息的处理方法没什么区别。分享到新浪微博 已投稿到: 排行榜

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值