乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 33|回复: 2

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

[复制链接]

32

主题

150

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
278
发表于 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.将菜单加入中
(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:nCommand(Adesk::UInt32 cmdIndex)
{
    acDocManager->pushResourceHandle(_hdllInstance);
    CString str1;
    m_pMenu->GetMenuString(cmdIndex,str1,MF_BYCOMMAND);
    acedPostCommandPrompt();
    acDocManager->popResourceHandle();
}
void CMenuTest1::OnUpdateMenu()
{
}
到这里我们已经成功地完成了任务.需要进一步做的只是onCommand()这个函数,也就是说,单击某一菜单项执行何种动作, 须要你在onCommand()函数中定义.
回复

使用道具 举报

2

主题

87

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
95
发表于 2011-7-15 14:30:00 | 显示全部楼层
收藏先,我的水平落后你们10年左右。
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-7-15 17:23:00 | 显示全部楼层
非常好的例子
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 14:42 , Processed in 0.196532 second(s), 58 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表