明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2320|回复: 2

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

[复制链接]
发表于 2003-5-12 14:49:00 | 显示全部楼层 |阅读模式
拥有一个灵活的菜单系统, 是优质软件的特点之一. 这里介绍如何在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()函数中定义.
发表于 2011-7-15 14:30:46 | 显示全部楼层
收藏先,我的水平落后你们10年左右。
发表于 2011-7-15 17:23:21 | 显示全部楼层
非常好的例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:39 , Processed in 0.148470 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表