|
说明
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 here
AcRx::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 here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here
//删除AcDbCircle类的协议扩展
AcDbCircle::desc()->delX(AcDbDoubleClickEdit::desc());
return (retCode) ;
}
|
|