1. 说明

ObjectARX提供了可修改的实体双击响应方式,  允许第三方ObjectARX应用程序根据需要指定自己的双击处理.

本篇程序处理了AutoCAD中双击实体事件处理的几个问题:

(1) 双击圆实体,可提供用户输入颜色,并修改圆的颜色

(2) 删除GUI中的默认的双击处理, 确保本节的双击处理功能在高版本的上也能运行.

(3) 双击处理代码的修改

2. 思路

要注册一种实体的双击处理,需要执行下边的步骤:

(1) 创建一个继承自 AcDbDoubleClickEdit 的新类, 在虚函数 startEdit 和 finishEdit 中定义自己的双击事件处理.

(2) 在应用程序的 InitApplication 函数中,初始化 AcDbDoubleClickEdit 类,为需要的实体类添加双击协议扩展.

(3) 在应用程序的 UnloadApplication 函数中, 从双击处理的实体类中删除双击协议扩展.

3. 步骤

1.  基本双击响应实现:

(1) 添加新类: CDoubleClickCircle , 它的基类设置为 AcDbDoubleClickEdit

重写 startEdit 和 finishEdit 两个虚函数. 实现圆实体的双击处理.

#include "acdblclkedit.h"
class CDoubleClickCircle : public AcDbDoubleClickEdit
{
public:CDoubleClickCircle(void);virtual ~CDoubleClickCircle(void);// 开始编辑时调用的函数void startEdit(AcDbEntity *pEnt, AcGePoint3d pt);// 完成编辑之后调用的函数void finishEdit(void);
};

双击事件是在应用程序环境下触发的,因此要修改实体的某些特性,必须锁定当前文档.

传递进来的 pEnt 所指向的实体, 打开状态是只读,  要通过 upgradeOpen 函数将其变为可写状态更符合一般人的操作习惯.

// 开始编辑时调用的函数
void CDoubleClickCircle::startEdit(AcDbEntity *pEnt, AcGePoint3d pt)
{//获得当前文档AcApDocument *pDoc = acDocManager->curDocument();//将AcDbEntity指针转换为AcDbLine指针if (pEnt->isKindOf(AcDbCircle::desc())){AcDbCircle *pCircle = AcDbCircle::cast(pEnt);//锁定文档acDocManager->lockDocument(pDoc);//将实体的打开状态升级为可写状态pCircle->upgradeOpen();//指定新的颜色pCircle->setColorIndex(1);pCircle->close();//解锁文档acDocManager->unlockDocument(pDoc);//清理PickFirst选择集中的内容acedSSSetFirst(NULL, NULL);//更新图形的显示pCircle->draw(); //在关闭之后还能使用actrTransactionManager->flushGraphics();acedUpdateDisplay();}else{acutPrintf(_T("\n无效的AcDbCircle对象..."));pEnt->close();return;}}// 完成编辑之后调用的函数
// 本例子并不在finishEdit函数中添加任何处理,但是这个函数的实现部分是一定要有,否则就会产生连接错误。
void CDoubleClickCircle::finishEdit(void)
{// 此处不添加任何函数
}

(3)  在应用程序的 On_kInitAppMsg 函数中,添加双击处理基类的初始化, 并且为圆的实体类型AcDbCircle 添加双击处理的协议, 其实现代码为:

virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {// TODO: Load dependencies here// You *must* call On_kInitAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;// TODO: Add your initialization code here//初始化AcDbDoubleClickEdit类AcDbDoubleClickEdit::rxInit();//为AcDbCircle类添加协议扩展CDoubleClickCircle *pCircleEdit = new CDoubleClickCircle;AcDbCircle::desc()->addX(AcDbDoubleClickEdit::desc(), pCircleEdit);return (retCode) ;}
        //初始化AcDbDoubleClickEdit类AcDbDoubleClickEdit::rxInit();//为AcDbCircle类添加协议扩展CDoubleClickCircle *pCircleEdit = new CDoubleClickCircle;AcDbCircle::desc()->addX(AcDbDoubleClickEdit::desc(), pCircleEdit);

(4) 在应用程序的 UploadApplication 函数中, 从 AcDbCircle 类中删除双击处理的协议, 确保应用程序卸载之后圆的双击处理仍然是 AutoCAD 提供的默认方式.

        //删除AcDbCircle类的协议扩展AcDbCircle::desc()->delX(AcDbDoubleClickEdit::desc());
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {// TODO: Add your code here// You *must* call On_kUnloadAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;// TODO: Unload dependencies here//删除AcDbCircle类的协议扩展AcDbCircle::desc()->delX(AcDbDoubleClickEdit::desc());return (retCode) ;}

(43)ObjectARX2015 + vs2012 JIG-双击实体的响应相关推荐

  1. (15)ObjectARX2015 + vs2012创建三维实体

    1. 说明         ObjectARX 中提供了三类创建三维实体的方法:                 (1)创建标准形状的实体                 (2)拉伸面域创建实体    ...

  2. 【CAD二次开发】实现双击实体的响应

    一.基本双击响应实现 通过向导在VS中创建MFC支持的新项目: 项工程中添加普通CDoubleClick类, 基类选择AcDbDoubleClickEdit: 类的头文件为: class CDoubl ...

  3. (7)ObjectARX2015 + vs2012创建多段线以及实体的旋转移动放缩

    提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...

  4. (14)ObjectARX2015 + vs2012创建和编辑对象时的动态拖动技术

    提示:看之前的博客(1)(4)和(12),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线 ...

  5. (6)ObjectARX2015 + vs2012创建圆弧

    提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...

  6. (9)ObjectARX2015 + vs2012创建面域

    提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...

  7. (12)ObjectARX2015 + vs2012创建尺寸标注

    提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...

  8. “双击Pycharm无响应”解决方案

    问题描述 昨晚直接关机,导致pycharm强制关闭,今早打开时双击图标无响应 解决方法 第一步:找到该路径下的cmd.exe,右键管理员身份打开: 第二步:在cmd窗口中,输入netsh winsoc ...

  9. WPF: 在 MVVM 设计中实现对 ListViewItem 双击事件的响应

    ListView 控件最常用的事件是 SelectionChanged:如果采用 MVVM 模式来设计 WPF 应用,通常,我们可以使用行为(如 InvokeCommandAction)并结合命令来实 ...

最新文章

  1. 归并排序是稳定的排序
  2. org.hibernate.hql.ast.QuerySyntaxException: ? is not mapped
  3. CSS中的BFC机制
  4. CloudFoundry和BOSH的关系
  5. MATLAB 中RMSE和MAPE的计算方法
  6. python fun函数、求4x4整型数组的主对角线元素的和_python中多维数组中列major的numpy整形...
  7. mysql 列 随机数_MYSQL中生产随机数或随机字符串
  8. 开店软件透彻分析推荐
  9. gdb 行号断点调试
  10. arcgis下载并部署/替换底图服务/IIS跨域--参考资料链接
  11. 论起凡尔赛文学,还是比不过数据分析师!
  12. 济南:建设中国软件名城
  13. python十六进制去掉0x_如何将一个整数转换为十六进制而在Python中没有多余的'0x'前导和'L'尾随字符?...
  14. 在动态表格中智能搜索框JS实现(layui的智能搜索不能手动输入的问题解决)
  15. 三款EPUB阅读软件对比
  16. Android按钮扩大动效,Android按钮动效UI设计教程
  17. 通俗理解 什么是量纲
  18. 目标检测YOLO实战应用案例100讲-基于YOLO模型的遥感影像 飞机目标检测技术研究
  19. asset store_恭喜Asset Store最畅销商品Brady Wright!
  20. pytorch 猫狗大战

热门文章

  1. 安装Chrome插件SwitchySharp时出现的“程序包无效”问题
  2. 咚咚咚————【封装驱动】DS3231时钟芯片读写程序,分享交流自己编写的程序。
  3. 小码哥-斗鱼直播APP之娱乐菜单展示
  4. python3使用timeit库做函数性能时间测试
  5. sql数据类型转换(cast() and convent())函数)(转)
  6. mac打开任何来源选项
  7. 模型泛化能力(泛化误差+泛化误差上界)| 15mins 入门 | 《统计学习方法》学习笔记(六)
  8. 免费的虚拟主机,搭建博客网站
  9. svn is already locked报错无法更新代码解决方法。
  10. 华为制造量子计算机,海思半导体还有希望,华为亮出新技术,或能为摩尔定律续命...