3.1.1、响应AutoCAD消息

AutoCAD发送给ObjectARX的消息主要包括以下的四类:

1、发送给所有应用程序的消息。

2、发送给使用acedDefun()注册了AutoLISP®函数的应用程序的消息。

3、发送给使用ObjectARX注册的应用程序的消息。

4、只能被使用ActiveX自动化应用程序响应的消息。

下面的5个表描分类描述了AutoCAD发送给ObjectARX应用程序的消息。第一个表是发送给所有应用程序的消息。

发送给所有应用程序的消息
消息名称
描述
kInitAppMsg
当ObjectARX应用程序加载,和AutoCAD建立通信的时候发送
kUnloadAppMsg
当ObjectARX应用程序卸载(或者AutoCAD关闭,用户终止程序),关闭文件并且执行清理操作。
kLoadDwgMsg
当图纸打开的时候发送,如果应用程序使用AutoLISP注册了任何函数,当每次图纸加载的时候AutoCAD会发送这个消息。 这个时候AutoCAD编辑器完成初始化,所有的全局函数都是可用的,然而,这个时候你不能调用 acedCommand() 函数(发送命令)。
kSaveMsg
当AutoCAD因为保存,另存为,新建,打开命令而保存图纸的时候发送。
kUnloadDwgMsg
当用户退出一个绘制环境的时候发送(与加载图纸对应kLoadDwgMsg)
kPreQuitMsg
在AutoCAD结束的时候发送,但是在开始卸载所有ObjectARX程序之前。
第二个表列出发送给使用acedDefun()注册了AutoLISP ®函数的应用程序的消息

发送给使用acedDefun()注册了AutoLISP ®函数的应用程序的消息
消息
描述
kInvkSubrMsg
使用acedDefun()函数注册的函数对应的消息产生
kEndMsg
一个命令结束,并且有些改变需要保存(当dbmod!=0时)。当新建和保存的时候不会发送这个消息,而当kSaveMsg和kLoadDwgMsg消息的时候发送。对应结束命令,如果dbmod=0,发送kQuitMsg,而不会发送kEndMsg消息。
kQuitMsg
当AutoCAD由于QUIT命令退出(没有保存),发送,还有当End命令时也发送,如上一条命令中所说,当End命令,而且dbmod = 0 时发送这个消息。
kCfgMsg
当AutoCAD从配置程序返回的时候发送,而且只有显示驱动有改变才会使用。
下面的表是发送给使用ObjectARX注册的应用程序的消息

发送给使用ObjectARX注册的应用程序的消息
消息
描述
kDependencyMsg
当ObjectARX应用程序有注册一个AcRxService对象,并且那个服务的dependency数量从0变为1时发送。
kNoDependencyMsg
.当ObjectARX应用程序有注册一个AcRxService对象,并且那个服务的dependency数量从1变为0时发送。
当一个应用程序使用了ActiveX自动化,应用程序需要去响应的消息。详细参考第25章,COM,ActiveX Automation,和对象属性管理.。

使用ActiveX自动化应用程序要响应的消息
消息
描述
kOleUnloadAppMsg
发送来决定应用程序是否能够被卸载。(在其他应用程序里面没有ActiveX对象或者接口被引用)
从rxdef.h文件里面查看 AppMsgCode描述的枚举内容。

你需要决定ObjectARX应用程序将响应哪些消息。下表给出了当收到一个给定的消息时建议的行动。

ObjectARX应用程序对AutoCAD消息的响应 
消息
推荐的行为
kInitAppMsg
注册服务,类,AcEd命令和反应器,AcRxDynamicLinker反应器。初始化应用程序的资源,比如驱动和窗口。执行所有所有的需要一次的初始化(静态量)。初始化所有AcRx,AcEd和AcGe类。存储pkt参数的值,如果你想锁住或者解锁你的应用程序。
这里不要去初始化设备的驱动,激活任何接口资源,应用程序应该按特点的顺序加载。不要去使用AutoLISP或者打开数据库。可能出现错误的条件,不要去调用任何的断言语句。AcDb和AcGi类库这个时候还没有初始化,尽管有关的AcRx和其他结构已经就位。
kUnloadAppMsg
执行最后的程序资源清理。同kInitAppMsg对应,所有在上面建立或者开始的对象,现在都要停止或者销毁。
不要执行在kInitAppMsg里面没有对应执行的东西。在这个时候AutoCAD会卸载大部分东西。除了这些在kInitAppMsg中描述的激活的类库列表。
kOleUnloadAppMsg
这个消息只有当应用程序使用了ActiveX自动化时才需要响应。
如果应用程序能够被卸载(没有ActiveX对象或者接口别其他应用程序调用)时返回AcRx::kRetOK。否则返回AcRx::kRetError。
kLoadDwgMsg
执行针对当前图纸的初始化,AcDb,AcGi,和其它用户接口API都从新激活,Whether anything has been done to the drawing is not specified.。所有AutoCAD支持的API现在都是激活的,这个时候你可以执行AtuoLISP函数的注册,并且初始化用户接口,还 可能处理的操作包括,轮询AutoCAD驱动,处理编辑反应器与当前数据库的关联.

对于每个图纸都一样的操作不要在这个时候做,这个消息在程序执行期间不会只发送一次。
kUnloadDwgMsg
做与kLoadDwgMsg消息相对应的清除操作。释放所有反应器,除了永久反应器。

不要释放不是与当前图纸关联的系统资源。不要清理AcRx类,AcEd反应器或者命令。他们对应编辑器还是有效的。
kDependencyMsg
为你的应用程序执行任何必要的操作,当其他应用程序依赖他的时候,比如锁住你的应用程序使得他不能被解锁
kNoDependencyMsg
为你的应用程序执行任何必要的操作,当其他应用程序不在依赖他的时候,比如解锁你的应用程序,使得他能够被锁住,当一个用户需要的时候。
kInvkSubrMsg
调用使用acedDefun()函数注册的函数,通过调用acedGetFuncode()函数类决定那个函数被调用,使用acedRetxxx()返回值。

不要执行的事情除了函数调用.
kPreQuitMsg
卸载你的程序使用的其他东西(应用程序,dlls等等)保证你的程序结束前他们都被卸载。
kEndMsg
kCfgMsg
kQuitMsg
kSaveMsg
考虑使用AcEditorReactor事件回调函数作为一种替代方法来应对这些消息
当使用AcEditorReactor事件回调函数响应这些消息的时候,这里就不要处理了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值