goldenshin 发表于 2003-5-12 14:49:00

编程日记(4)右键菜单的使用

拥有一个灵活的菜单系统, 是优质软件的特点之一. 这里介绍如何在Arx中定制鼠标右键菜单.
step1.建立工程, 插入菜单
(1)建立一个支持Arx及MFC的Project.
(2)利用MFC的菜单功能,在”资源”中建立”所见即所得”的菜单.

Step2.定义一个”类” ( CMenuTest1 )来管理菜单. 在构造函数中调入step1所插入的菜单资源,在析构函数中去掉这一资源
(1)定义CMenuTest1类
#include "aced.h"
class CMenuTest1 : publicAcEdUIContext
{
public:
        CMenuTest1();
        virtual ~CMenuTest1();
    virtual void* getMenuContext(const AcRxClass *pClass, const AcDbObjectIdArray& ids) ;
    virtual voidonCommand(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()函数中定义.

hourui800720 发表于 2011-7-15 14:30:46

收藏先,我的水平落后你们10年左右。

chpmould 发表于 2011-7-15 17:23:21

非常好的例子
页: [1]
查看完整版本: 编程日记(4)右键菜单的使用