|
响应AutoCAD消息
AutoCAD 传递给ObjectARX应用程序的消息有四类:
• 传送给所有应用程序的消息.
• 仅当应用程序使用acedDefun()注册AutoLISP函数时传送的消息
• 传递给用ObjectARX已经注册服务的应用程序消息
• 只对使用ActiveX控件的应用程序需要作出响应的消息
下面五个表分别介绍了AutoCAD传送给ObjectARX应用程序的消息.下表列举了传送给所有应用程序的消息.
发送给所有应用程序
消息 说明
kInitAkInitAppMsg 当ObjectARX应用程序被加载并打开AutoCAD和应用程序之间通信时发送的消息.
kUnloadAppMsg 当ObjectARX应用程序被卸载时(当卸载应用程序或退出AutoCAD时)发送该消息.关闭文件并清除操作
kLoadDwgMsg 当打开图形时发送该消息.然后,如果应用程序使用AutoLISP注册函数时,AutoCAD向调入编辑器的每一个图形发送该消息.此时,AutoCAD编辑器已被完全初始化,所有全局函数都可用. 但是,在kLoadDwgMsg时不能使用acedCommand()函数
kSaveMsg 当输入了SAVEAS、NEW或OPEN命令后,在AutoCAD保存图形时发送该消息
kUnloadDwgMsg 当退出图形窗口时发送该消息
kPreQuitMsg 当退出AutoCAD时,在开始卸载所有ObjectARX应用程序之前发送该消息.
下表列出了应用程序使用acedDefun()注册AutoLISP函数时,AutoCAD发送给应用程序的消息
使用AutoLISP函数时发送的消息
消息 说明
kInvkSubrMsg 当使用acedDefun()调用函数注册时发送此消息
kEndMsg 只有当图形被修改,输入END命令后,需要保存时(当dbmode不为0)发送此消息.对NEW或OPEN命令,不发送此消息,而发送kSaveMsg和kLoadDwgMsg.对END命令,如果dbmode为0,则发送kQuitMsg,而不是kEndMsg.
(2000后END命令停止使用)
kQuitMsg 当输入QUIT命令后AutoCAD退出(退出但不存盘)时发送该消息.
注释: kQuitMsg消息发送与KPreQuitMsg消息之前.
kCfgMsg 只有当改变了显示驱动程序,AutoCAD从配置程序返回时发送该消息.
下表列出了如果使用ObjectARX已注册一个服务时应用程序收到的消息.
应用程序注册服务时收到的消息
消息 说明
kDependencyMsg 当ObjectARX应用程序已经注册了一个AcRxService对象,并且该服务的从属计数器从0变为1时发送该消息
kNoDependencyMsg 当ObjectARX应用程序已经注册了一个AcRxService对象,并且该服务的从属计数器从1变为0时发送该消息.
下表列出了如果应用程序使用ActiveX Automation时需要响应的消息.
使用ActiveX Automation时需要响应的消息
消息 说明
kOleUnloadAppMsg 确定应用程序是否可以被卸载时发送该消息(没有其他应用程序引用ActiveX对象或界面).
在rxdefs.h文件中,AppMsgCode类说明定义了这些枚举常量.
我们必须确定ObjectARX应用程序将对哪一个消息作出响应.下表介绍了收到每一个消息后的推荐操作内容
收到消息后的操作
消息 操作
kInitAppMsg 允许注册服务、类、AcEd命令及反应器和AcRxDymicLinker反应器;初始化应用程序系统资源,如设备和窗口;执行所用初始化工作;AcRx、AcEd和AcGe都被激活;如果想解锁和锁定其应用程序时,保存pkt参数值.
不允许初始化设备驱动程序、激活任意接口资源,以特殊的顺序加载应用程序、调用AutoLISP或者打开任意数据库.否则会引起错误甚至导致系统崩溃.虽然有关的Ac结Rx和其他结构被激活,但AcDb和AcGi库通常尚未被激活 .
kUnloadAppMsg 允许执行最后系统资源清理工作,任何在kInitAppMsg中开始或创建对象,应当在此处停止或析构.
不要除在kIniAppMsg中激活库外,当调用了该消息时,AutoCAD通常被卸载 .
kOleUnloadAppMsg 允许只有使用ActiveX的应用程序响应此消息.
不允许:如果应用程序可以被卸载(没有其他应用程序引用该应用程序的ActiveX对象或界面).以AcRx::kRetOK回应.如果应用程序不能被卸载,则以AcRx::kRetError回应
kLoadDwgMsg 执行有关当前图编辑会话的初始化。AcDb、AcGi和用户接口API都在此时激活.所有AutoCAD提供的API被激活.我们可在此时执行AutoLISP函数注册,并初始化用户接口.此时进行其他操作,包括检查AutoCAD驱动程序.如果用户想尽早的访问acdbHostApplicationServices()->workingDatabase(),可以查询AcEditorRector事件
不允许:对每个图形编辑会话不需要任何处理,不只一次向每个程序执行传送该消息.
kUnloadDwgMsg 释放或清除响应kLoadDwgMsg消息时开始或注册的所有工作.释放所有AcDb反应器,清除持久反应器.
不允许:释放与当前编辑会话无关的系统资源,或清除AcRx类、AcEd反应器或命令;他们在编辑会话之间保持有效.
kDependencyMsg 如果其他应用程序依赖于我们的应用程序,执行所有对应用程序必须的操作,如锁定应用程序使它不能被卸载.
kNoDependencyMsg 如果其他应用程序不依赖于我们的应用程序,执行所有对应用程序必须的操作,如解锁应用程序,使它在用户需要时可以被卸载.
kInvkSubrMsg 调用acedDefun()注册的函数,调用acedGetFundode()确定函数,用acedRetxxx()返回结果.
不允许:除了函数调用外的任何操作.
kPreQuitMsg 卸载应用程序的调用的附属(应用程序、DLL,等等)确保它们能在应用程序卸载之前被卸载.
kEndMsg
kCfgMsg
kQuitMsg
kSaveMsg 使用AcEdEditorReactor事件回调作为对这些消息的响应.
不允许:如果我们正在对响应通过AcEditorReactor进行等价事件回调时,响应这些消息. |
|