编程日记_ARX中右键菜单的使用 编程相关 编程相关 frustrationwk.boke...

来源:百度文库 编辑:神马文学网 时间:2024/07/08 18:49:46
拥有一个灵活的菜单系统, 是优质软件的特点之一. 这里介绍如何在Arx中定制鼠标右键菜单.
step1.建立工程, 插入菜单
(1)建立一个支持Arx及MFC的Project.
(2)利用MFC的菜单功能,在”资源”中建立”所见即所得”的菜单.

Step2.定义一个”类” ( CMenuTest1 )来管理菜单. 在构造函数中调入step1所插入的菜单资源,在析构函数中去掉这一资源
(1)定义CMenuTest1类
#include "aced.h"
class CMenuTest1 : public AcEdUIContext
{
public:
 CMenuTest1();
 virtual ~CMenuTest1();
virtual void* getMenuContext(const AcRxClass *pClass, const AcDbObjectIdArray& ids) ;
virtual void onCommand(Adesk::UInt32 cmdIndex);
virtual void OnUpdateMenu();
private:
 CMenu *m_pMenu;
 HMENU m_tempHMenu;
};

(为了使用AcEdUIContext,请插入头文件aced.h)

(2)构造函数中调入step1所插入的菜单资源
HINSTANCE _hdllInstance = NULL;//全局变量
CMenuTest1::CMenuTest1()
{
acDocManager->pushResourceHandle(_hdllInstance);
m_pMenu = new CMenu;
m_pMenu->LoadMenu(IDR _MENU1); // IDR _MENU1是要调入的菜单
acDocManager->popResourceHandle();
}

(3)在析构函数中去掉这一资源
CMenuTest1::~CMenuTest1()
{
if (m_pMenu)
delete m_pMenu;
}


step3.将菜单加入AutoCAD中
(1)定义全局变量, 表示菜单实例
CMenuTest1 *menu1;
我们希望当Arx被加载时菜单也被自动加载, 因此在Arx的InitApplication()中用New 来创建实例
menu1=new CMenuTest1;
当然, 在 UnloadApplication()清除这一实例
acedRemoveDefaultContextMenu(menu1);
delete menu1;
(2)用New所创建的指针, 并没有将菜单加入AutoCAD中, 因此还要在InitApplication中做一点操作
acDocManager->pushResourceHandle(_hdllInstance);
acedAddDefaultContextMenu(menu1, pAppID);

//其中pAppID是消息循环中所传递过来的指针,因此InitApplication()的定义改为: InitApplication(void* pAppID), 在调用时则变为InitApplication(pkt);


(3)在类CMenuTest中,还有三个虚函数要定义, 如下:
void *CMenuTest1:: getMenuContext(const AcRxClass *, const AcDbObjectIdArray&)
{
m_tempHMenu = m_pMenu->GetSubMenu(0)->GetSafeHmenu();
return &m_tempHMenu;
}

void CMenuTest1::onCommand(Adesk::UInt32 cmdIndex)
{
acDocManager->pushResourceHandle(_hdllInstance);

CString str1;
m_pMenu->GetMenuString(cmdIndex,str1,MF_BYCOMMAND);
acedPostCommandPrompt();
acDocManager->popResourceHandle();
}

void CMenuTest1::OnUpdateMenu()
{
}

到这里我们已经成功地完成了任务.需要进一步做的只是onCommand()这个函数,也就是说,单击某一菜单项执行何种动作, 须要你在onCommand()函数中定义.