当前位置:甜馍馍地理信息网 >> 地理信息系统GIS >> 组件式GIS >> 正文 >>  [阅读资讯:经典 ObjectARX中右键菜单的实现方法代码]

经典 ObjectARX中右键菜单的实现方法代码

[ 来源:互联网 | 时间:2007年12月08日 | 收藏本文 ] 【

一说到右键菜单,众所周知,家喻户晓。右键菜单在系统里的作用不言而喻,那么在ObjectARX中如何实现右键菜单呢?ObjectARX本身提供了一套处理上下文菜单的机制。在ObjectARX类库中有一个名为AcEdUIContext的类,此类负责在ObjectARX应用中的上下文菜单中添加自己的菜单项,而原菜单项不会被破坏,这也是此种方法的优点之一。

右键菜单,也叫快捷菜单,在Windows编程中叫上下文(context)菜单。用AcEdUIContext类添加菜单时,菜单项的数目没有限制,但必须是文本菜单。菜单可以层叠,但不允许使用键盘加速键,不能够在状态行显示快捷菜单命令状态提示。此类可以处理三种情况下的上下文菜单:一个默认上下文菜单,二是实体对象上下文菜单,三是命令执行时上下文菜单。虽然菜单出现的时机不同,但方法基本相同,它们之间主要的不同是所用的加载和卸载函数不同。下面加以详细介绍。

在AcEdUIContext为中包含了三个重要的成员函数,他们分别是:

(1) AutoCAD系统获取快捷菜单句柄函数
virtual void * getMenuContext(const AcRxClass * unnamed,const AcDbObjectIdArray& unnamed) = 0;
其中,第一个参数unnamed 是当前所选择的实体的对象句柄,第二个参数unnamed是所选实体的实体ID数组。这两个参数只有在实体对象上下文菜单中有效。

(2) 菜单项命令事件响应函数
virtual void onCommand(Adesk::UInt32 unnamed) = 0;
其中,unnamed是相应菜单项的菜单ID。此函数在用户选择执行快捷菜单中的某个菜单项时被调用。

(3) 菜单更新函数
virtual void OnUpdateMenu();
AutoCAD在快捷菜单弹出之前调用此函数。相当于MFC中的菜单更新事件,我们可以在这个函数中改变菜单项的检查状态或使能菜单项等。

其实,我们利用ObjectARX实现上下文菜单要做的工作主要是重载并填写这几个AcEdUIContext成员函数,其操作方法如下:

首先,我们从AcEdUIContext类派生一个自己的类,名字就叫CDefaultContextMenu吧,当然,你可以按自己的喜好起名字了:-)。然后,在派生的类中重载以上三个函数。

class CDefaultContextMenu: public AcEdUIContext
{
public:
CDefaultContextMenu();
~CDefaultContextMenu();

// 如下重载以下三个函数
virtual void* getMenuContext(const AcRxClass *pClass, const AcDbObjectIdArray& ids) ;
virtual void onCommand(Adesk::UInt32 cmdIndex);
virtual void OnUpdateMenu();

private:
CMenu *m_pDemoMenu; // 用来增加菜单项的MFC菜单对象,使用它是为了加载我们在VC中增加的菜单资源。
HMENU m_hDemoMenu;  // 菜单项所对应的句柄,这才是我们真正要加载的的菜单项,它是m_pDemoMenu中的一项。
};

接下来我们需要做的是:(1)在构造函数中加载菜单资源;(2)在getMenuContext函数中添加显示我们自己菜单项的代码;(3)在onCommand函数中处理命令执行代码;(4)在OnUpdateMenu中修改菜单项的显示状态(此步可选可不选);(5)在析构函数中卸载资源。

--在构造函数中加载菜单资源
acDocManager->pushResourceHandle(_hdllInstance); // 切换当前使用的资源,千万不要忘记加上吆!_hdllInstance是模块
 //实例指针,通过extern引用到使用的位置就可以了。
m_pDemoMenu= new CMenu;  // 创建一个菜单对象
m_pDemoMenu->LoadMenu(IDR_DEMO_DEFAULT_MENU);// 使用创建的菜单对象加载在资源编辑器中编辑好的资源
acDocManager->popResourceHandle();   // 再把资源切换回来吧!

--在getMenuContext函数中添加显示我们自己菜单项的代码
m_hDemoMenu= m_pDemoMenu->GetSubMenu(0)->GetSafeHmenu(); // 这里我们就显示已经加载的菜单(m_pDemoMenu)中的第一个子菜单吧!
return &m_hDemoMenu; // 返回子菜单对象的句柄

--在onCommand函数中处理命令执行代码
acDocManager->pushResourceHandle(_hdllInstance); // 切换当前使用的资源

CString strMenuTitle, strPrompt;
m_pMenu->GetMenuString(cmdIndex,strMenuTitle,MF_BYCOMMAND);  // 获取一所选菜单项的文本标题
strPrompt.Format("\n您已经选取了菜单:%s\n",strMenuTitle);
acutPrintf(strPrompt);   // 我们的例子显示哪一个菜单项被选择
acedPostCommandPrompt(); // 显示命令提示

acDocManager->popResourceHandle();   // 将资源切换回来

下一页
本文共 2 页,第  [1]  [2]  页

【推荐本文】 【打印本页】 【返回顶部
最新文章
推荐文章