一、基本双击响应实现

  1. 通过向导在VS中创建MFC支持的新项目;
  2. 项工程中添加普通CDoubleClick类, 基类选择AcDbDoubleClickEdit:

类的头文件为:

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

(2)startEdit函数是在用户双击指定类型实体之后触发
实现代码:

void CDoubleClick::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(TEXT("\n无效的AcDbCircle对象..."));pEnt->close();return;}
}

(3)本例子并不在finishEdit函数中添加任何处理,但是这个函数的实现部分是一定要有,否则就会产生连接错误。
实现代码:

void CDoubleClick::finishEdit(void)
{//此处不处理
}

(4)在acrxEntryPoint.cpp 文件中的 On_kInitAppMsg (void *pkt) 函数中,添加双击处理基类的初始化,并且为圆的实体类型添加AcDbCircle添加双击处理的协议。
实现代码(AutoCAD 2010 及以前版本):

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// AutoCAD 2010 及之前版本需要,之后版本需注释掉后在头文件后增加// ACRX_DEFINE_MEMBERS(AcDbDoubleClickEdit);//初始化AcDbDoubleClickEdit类AcDbDoubleClickEdit::rxInit();//为AcDbCircle类添加协议扩展CDoubleClick *pCircleEdit = new CDoubleClick;AcDbCircle::desc()->addX(AcDbDoubleClickEdit::desc(), pCircleEdit);return (retCode) ;
}

并在附加依赖项中添加 AcDblClkEditPE.lib

注(重复补充):
从AutoCAD2010开始,双击响应不是在 AcDbClkEditPE.arx 中实现,只需要做以下修改:
1)将 On_kInitAppMsg 函数中的下面代码注释掉:

AcDbDoubleClickEdit::rxInit();

2)只在acrxEntryPoint.cpp 文件中添加下面代码(在头文件的后面添加):

ACRX_DEFINE_MEMBERS(AcDbDoubleClickEdit);

3)工程设置中不再需要依赖AcDbClkEditPE.lib.

(5)在acrxEntryPoint.cpp 文件中的On_kUnloadAppMsg (void *pkt) 函数中,从AcDbCircle类中删除双击处理的协议,确保应用程序在卸载之后圆地双击处理仍然是AutoCAD提供的默认方式。
实现代码:

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) ;
}

二、案例:通过对话框接收用户输入的颜色值
(1)添加一个对话框资源:

设置ID和caption:

设置字体:

(2)在对话框资源中添加一个标签控件:(静态文本说明略)

(3)保存工程。使用ObjectARX MFC工具为当前的对话框添加关联的类,类名为CGetColorDlg,基类设置为CAcUiDialog
操作:项目—>新建项—>Autodesk—>MFCSupport
类名:类名为CGetColorDlg

(4)添加CGetColorDlg的两个消息映射函数。

(5)添加文本对话框控件IDC_COLOR_INDEX控件的映射成员变量m_colorIndex,并将它的有效范围设置为0~256
右击示例编辑框->添加成员变量:

(6)在OnInitDialog消息中,调用UpdateDate函数来将成员变量的值更新到关联的界面控件中去
实现代码:

BOOL CGetColorDlg::OnInitDialog()
{CAcUiDialog::OnInitDialog();// TODO:  在此添加额外的初始化//根据成员变量更新资源控件UpdateData(FALSE);return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}

(7)OnOk函数的实现

void CGetColorDlg::OnOK()
{// TODO: 在此添加专用代码和/或调用基类//根据资源控件更新成员变量if (!UpdateData(TRUE)){return;}CAcUiDialog::OnOK();
}

(8)在对话框类CGetColorDlg中添加两个成员函数SetParams 和GetParams
声明:

public:void SetParams(int colorIndex);void GetParams(int &colorIndex);

实现:

//设置对话框中的初始颜色值:
void CGetColorDlg::SetParams(int colorIndex)
{m_ColorIndex = colorIndex;
}

//获取对话框中用户输入的新颜色值

void CGetColorDlg::GetParams(int &colorIndex)
{colorIndex = m_ColorIndex;
}

(9)在 startEdit 函数中添加显示对话框获取用户输入的相关代码
修改DoubleClickCircle.cpp 的 startEdit 函数:

void CDoubleClick::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();//提示用户指定新的颜色int oldColorIndex = pCircle->colorIndex();CAcModuleResourceOverride myResource; //防止资源冲突CGetColorDlg dlg;dlg.GetParams(oldColorIndex);if (dlg.DoModal() == IDOK){int newColorIndex = 0;dlg.GetParams(newColorIndex);pCircle->setColorIndex(newColorIndex);}//pCircle->setColorIndex(1);pCircle->close();//解锁文档acDocManager->unlockDocument(pDoc);//清理PickFirst选择集中的内容acedSSSetFirst(NULL, NULL);//更新图形的显示pCircle->draw(); //在关闭之后还能使用actrTransactionManager->flushGraphics();acedUpdateDisplay();}else{acutPrintf(TEXT("\n无效实体对象..."));pEnt->close();return;}
}

(10)消除CUI中的双击处理带来的影响
在CAD的命令栏执行命令:CUI
找到 “圆” ,右键->删除:
双击即可实现修改颜色功能。

参考文章:
【CAD二次开发】-ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)

【CAD二次开发】实现双击实体的响应相关推荐

  1. CAD二次开发--像纬地与CASS程序一样双击桌面图标实现插件的自动挂载(不用netload也不用进入后输入挂载命令)

    先说一下我为什么要写这个文章,首先这一块我自己研究并查找了很久,始终没有很好的办法.二是网络上很多办法鱼龙混杂,要不很复杂,要不现在就已经过时了,总之不能解决问题.干脆自己写一下,防止遗忘! 要明白C ...

  2. cad二次开发程序的绿色安装

    此问题的引入是因为一个cad二次开发软件,客户要求做成绿色安装.何为绿色安装呢?软件包copy到一台电脑上(已安装CAD),双击exe,打开的界面包含自定义的菜单.菜单的图标能正确显示.每个功能能使用 ...

  3. intersect 相交 范围_关于CAD二次开发中(范围线自相交)相交线的问题

    CAD二次开发对于毕业没多久,又是半路出家的我来说,是一个很大的挑战,遇到过很多难以解决的问题,这次在CAD二次开发遇到一个很苦恼的问题:判断 一个由线段组成的闭合区域中,是否存在着相互之间相交的线段 ...

  4. CAD 二次开发 图层操作(3)取得指定图层下的所有对象id

    对于CAD二次开发的人来说,可能需要对某一图层下的实体(点,线,面域,块,三维实体)进行不同的操作.下面的方法,即可实现获取指定图层名称下的所有实体ID. 输入参数为图层名称: 返回值为:对象主键集合 ...

  5. 关于objectArx /CAD二次开发中“属性块”操作

    关于objectArx /CAD二次开发中"属性块"操作 属性块就是在图块上附加一些文字属性(Attribute),这些文字可以非常方便地修改.属性块被广泛应用在工程设计和机械设计 ...

  6. CAD二次开发(C#)第三节

    前言 这是最后一部分代码,往后若有时间,对其中的代码详细讲解.初心不变,以便日后查看.特别感谢作者孙成波译作<AutoCAD .NET 开发指南 2012 版>.三部分代码里面有些许失误, ...

  7. c#CAD二次开发全套视频目录

    本人非专业编程人员,设计院画图民工一名.自学CAD编程,也写了一些小程序!初期学习lisp编程语言,基本了解CAD各中开发模块,写过一些程序!前段时间自学C#CAD二次开发,遍布网上无教学视频.经过自 ...

  8. CAD二次开发(C#) 第一节

    前言 由于工作需要,最近在学习二次开发,将其记录于此,以便日后查看. 语法 涉及"特性","进程"知识点,需要有所了解 #region CAD二次开发--第一节 ...

  9. c#CAD二次开发 块、属性块的一些重要的知识点概念

    本人录制c#CAD二次开发视频 基础入门全套,感兴趣可以淘宝搜索店铺 PT的cad小店 https://i.xue.taobao.com/detail.htm?spm=a2174.7765247.0. ...

最新文章

  1. LeetCode简单题之三角形的最大周长
  2. java连接kafka api_Kafka-JavaAPI(Producer And Consumer)
  3. 中国平安:杀进智能合约,你怕不怕?
  4. CyclicBarrier 和CountDownLatch使用详解
  5. Java 打飞机(小游戏)[版权非本人 本人制作收藏整理]
  6. [RabbitMQ]工作队列原理_代码实现
  7. strictmath_Java StrictMath ulp()方法与示例
  8. 安卓rtmp推流app_同城直播电商APP小程序平台开发
  9. 获取输出最大角标 php,html实现消息按钮上的数量角标的实例详解
  10. 微信公号“架构师之路”学习笔记(三)-MQ消息可达性_幂等性_延时性架构设计(应用场景、可靠投递、流量冲击)
  11. 账龄分析表excel模板_这种高端表格模板你会做吗?Excel制作带照片的员工信息查询表...
  12. Java白皮书的关键术语
  13. 网吧网吧无盘服务器配置,网吧无盘服务器配置杂谈
  14. Dubbo服务调用流程源码分析(服务调提供方)
  15. 中国水墨风的小学学校网站模板
  16. 服务端验证防水墙验证码向远程发送请求并验证的方法
  17. java delphi aes加密算法_谁有C#与delphi通用的AES加密算法
  18. Java JDK安装及环境变量配置(windows)
  19. Kaggle获奖者自述比赛求生指南:我们如何“穿越”亚马逊热带雨林
  20. 层序遍历 和 基于栈实现的先\中\后序遍历

热门文章

  1. Imatest 崩溃
  2. JavaScript创建数组
  3. 谷歌浏览器(Chrome)安装插件出现“CRX-HEADER-INVALID”解决办法
  4. Github 初学够用指南(B站笔记)
  5. 高斯分布、多维高斯分布、各向同性的高斯分布及多元高斯分布之间的KL散度
  6. 解决Vista/Server 2008/win 7 右下角网络连接出现黄色感叹号问题
  7. Transformer入门(一)——结构
  8. win10 系统电脑开启 热点(电脑需连接网络)
  9. 荐书丨企业业务架构的发展及与IT架构的关系
  10. 教你按摩牙龈护齿十大秘诀