zoukankan      html  css  js  c++  java
  • 如何在AutoCAD中实现鼠标双击事件

    摘要:本文为在AutoCAD ObjectARX二次开发中遇到的鼠标双击事件提供了多种解决方法。
    在AutoCAD编程中,开发者可能会有这样一个好想法,或者用户有这么一个需求:当用鼠标双击某个实体的时候,弹出一个窗体,显示实体的属性,比如说,一所学校的名称、座落等信息。

    (一) 在AutoCAD2000i中的实现
    在AutoCAD2000i中有一个新的ObjectARX
    API专门用来处理实体的双击事件,此API基于新的ARX类AcDbDoubleClickEdit。在AutoCAD2000i中双击实体时,默认的行为是调用相应的实体定义编辑器或对象属性管理器。如果多个实体同时被选中,在选择集中双击实体会弹出对象属性管理器。对于自定义实体,可以重载双击事件,改变默认行为,为此需要从AcDbDoubleClickEdit为每个要处理双击事件的实体派生类。请看下面是一个处理多义线的例子(为节省篇幅,一些代码已经省略):
     #include "AcDblClkEdit.h"
     class AcDbDoubleClickEditPline : public AcDbDoubleClickEdit
     {
     public:
     
     ...
     void startEdit(AcDbEntity *pEnt,AcGePoint3d pt);
     void finishEdit(void);
     };
    为了接受通告消息,在这个类中必需声明两个方法:一个是startEdit(),另一个是finishEdit()。
    当应用程序被加载的时候,AcDbDoubleClickEdit类要对要处理的数据库对象增加协议扩展,例如在InitApplication()初始化过程中增加如下的代码:
    pPlineEdit = new AcDbDoubleClickEditPline;
     AcDbPline::desc()->addX(AcDbDoubleClickEdit::desc(),pPlineEdit);
    同样地,在卸载应用程序的时候去除数据库对象的协议扩展,方法如下:
    AcDbPline::desc()->delX(AcDbDoubleClickEdit::desc());
    要使程序能够被编译,还必需连接AcDblClkEditPE.lib库,并且在InitApplication()中增加如下的代码:
    acrxDynamicLinker->loadModule(/*MSG0*/"ACDBLCLKEDITPE.ARX",Adesk::kFalse);

    (二) 在AutoCAD2000和2002中的实现
    在AutoCAD2000和2002中没有AcDbDoubleClickEdit类,又如何来响应双击呢?
    了解ObjectARX的朋友应该知道,Autodesk为开发者提供了反应器机制,它类似于MFC的消息处理,利用它我们可以响应输入事件、实体添加/编辑/删除等事件。常见的AutoCAD反应器有:编辑反应器(AcEditorReactor)、实体反应器(AcDbEntityReactor)、对象反应器(AcDbObjectReactor)、图形数据库反应器(AcDbDatabaseReactor)、文档管理反应器(AcApDocManagerReactor)等。
    我们在这里是利用编辑反应器来实现鼠标双击事件的响应的,下面是实现步骤。
    第一步 我们要利用向导工具派生一个新的编辑反应器类――TTCDblClkTestReactor。并重载编辑反应器的如下方法:
    virtual void beginDoubleClick(const AcGePoint3d& clickPoint);
    第二步 声明一个全局TTCDblClkTestReactor对象,如下:
    static TTCDblClkTestReactor *gpDblClkTest;
    第三步 在应用程序初始化时创建反应器对象。
    // Init this application. Register your
     // commands, reactors...
     void InitApplication()
     {
     // NOTE: DO NOT edit the following lines.
     //{{AFX_ARX_INIT
     AddCommand("TT", "TEST", "TEST", ACRX_CMD_TRANSPARENT |
     ACRX_CMD_USEPICKSET, TTtest);
     //}}AFX_ARX_INIT
     
     // TODO: add your initialization functions
     gpDblClkTest = new TTCDblClkTestReactor(); // 创建编辑反应器对象
     }
    第四步 在应用程序卸载时从内存中清除反应器对象。
    // Unload this application. Unregister all objects
     // registered in InitApplication.
     void UnloadApplication()
     {
     // NOTE: DO NOT edit the following lines.
     //{{AFX_ARX_EXIT
     acedRegCmds->removeGroup("TT");
     //}}AFX_ARX_EXIT
     
     // TODO: clean up your application
     if(gpDblClkTest)
     {
     delete gpDblClkTest; // 清除编辑反应器对象
     gpDblClkTest = NULL;
     }
     }
    第五步 响应鼠标事件,编写响应代码。
    void TTCDblClkTestReactor::beginDoubleClick(const AcGePoint3d& clickPoint)
     {
     // 在此编写你的鼠标事件代码
     AfxMessageBox("这是一个测试程序!");
     }
    好了,看一下您的郊果吧!祝您开心!J
    其实,实现鼠标双击事件的方法还有,我这里知道的还有:(1)利用Windows系统或AutoCAD
    Hook消息;(2)利用acedGrRead()函数。不过本人不提倡此两种做法,原因是它们实现比较麻烦,异常控制比较难解决,也不符合面向对象编程的理念。当然,当你遇特殊情况时用一下也未尝不可。
  • 相关阅读:
    解析漏洞总结
    ssh登录日志位置
    xshell ssh连接linux时提示ssh服务器拒绝了密码
    Linux安装ssh
    Apache Shiro (Shiro-550)(cve_2016_4437)远程代码执行
    CVE-2019-1388 UAC提权复现
    CVE-2019-0708复现之旅
    Apache Flink漏洞(CVE-2020-17519)复现
    FourEye(重名免杀实践)过360
    CVE-2020-11651:SaltStack认证绕过复现
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106890.html
Copyright © 2011-2022 走看看