【文件属性】:
文件名称:使用事件-vscode上配置 c语言环境的图文教程
文件大小:3.75MB
文件格式:PDF
更新时间:2021-06-09 14:24:14
CAD二次开发
第7章 使用事件
事件是AutoCAD发出的通知或消息,用以通知用户当前的会话状态,或提醒用户发生了什么情况。例
如,当保存图形时会触发 BeginSave 事件。当关闭图形时,启动一个命令时,甚至修改一个系统变量时,
都会有事件被触发。知道了这些信息,我们就可以编写一个子程序,或事件处理程序,使用这些事件来跟踪
对图形的修改,或者跟踪记录用户在绘制某一特定图形时所花费的时间,等。
7.1 了解AutoCAD中的事件
AutoCAD 中有许多不同类型的事件。下面是一些常见的事件类型:
Application 事件 – 对AutoCAD关闭、修改系统变量、开始双击以及进入和离开模式的状态等作出反
应。对于系统变量的修改也有文档级事件。
Database 事件 – 对保存图形、添加删除修改对象、插入块参考、添加和修改外部图形(xrefs)等作出
反应。
Document 事件 – 对关闭图形、运行AutoCAD命令、运行 AutoLISP 命令或函数、修改系统变量等
作出反应。
DocumentCollection 事件 – 对文档的创建与销毁、成为活动文档或进入非活动状态、以及文档的
锁定模式发生变化等作出反应。
Editor 事件 – 对请求用户输入期间发生的变化作出反应。
Graphics 事件 – 对视图的创建与销毁、视图的配置发生变化等作出反应。
Plotting 事件 – 对打印布局作出反应。
Publishing 事件 – 对发布布局作出反应。
Runtime 事件 – 对加载与卸载模块、变量发生变化或正在修改变量等作出反应。
Windows 事件 – 对窗体的状态栏、托盘项目、调色板和信息中心的变化做出反应。
响应事件的子程序称之为事件处理程序(event handlers),每当指定的事件被触发时,就会自动执行事件
处理程序。事件返回的参数所包含的信息,如 SystemVariableChanging 事件中的系统变量名,会从事件处
理程序传递给 SystemVariableChangingEventArgs 对象。
7.2 事件处理程序的原则
事件只是简单地提供了关于AutoCAD的状态或发生在AutoCAD中的活动的信息,记住这 一点非常重要的。
尽管可以编写事件处理程序来响应那些事件,但触发事件处理程序的操作中间是有个AutoCAD在那儿的。因
此,如果想让事件处理程序与AutoCAD及数据库一起 使用时提供安全可靠的操作,必须对事件处理程序能做
什么不能做什么有所限制。
原则1:不要依赖于事件的顺序。 编写事件处理程序时,不要依赖于你所认为的事件发生的确切顺序
序列。例如,如果你运行OPEN 命令,CommandWillStart 事件、DocumentCreateStarted 事件、
DocumentCreated 事件和 CommandEnded 事件都会被触发。然而,这些事件可能不会每次都以确切的顺
序发生。你唯一可以依赖的是成对儿发生的那两个事件:开 始事件和结束事件。
原则2:不要依赖于操作的顺序。
如果你删除了对象 1,然后又删除了对象 2,不要依赖一个事实,即您将先收到对象1的 ObjectErased
事件,然后收到对象 2 的 ObjectErased 事件。你可能会先收到 对象 2 的 ObjectErased 事件。
原则3:不要从事件处理程序内尝试任何交互功能。试图从事件处理程序内执行交互功能会引起严重问
题,因为事件被触发时 AutoCAD可能仍在处理命令。因此,应该牢记避免从事件处理程序中执行下列操作:
在命令提示行请求输入、请求选择对象以及使用 SendStringToExecute()方法等。
原则4:不要从事件处理程序内启动对话框。
一般认为对话框是一种交互功能,会干扰到AutoCAD的当前操作,而消息框和警告框不是交互功能,可以
放心使用;不过,在下列事件的处理程序里发出消息框可能会导致意想不到的结果序列: EnterModal、
LeaveModal、DocumentActivated、 DocumentToBeDeactivated 等。
原则5:可以向数据库中的任何对象写入数据,但应避免修改引发事件的那个对象。很显然,引发事件
的那个对象已经打开并且还处在当前的操作过程中。因此,应避 免从该对象的事件处理程序修改这个对象。
不过,可以放心地从触发事件的对象读取信息。
原则6:不要从事件处理程序执行可能会触发相同事件的任何操作。
如果在事件处理程序中执行触发同一事件的相同动作,就会进入一个无限循环(死 循环)。例如,永远不
要试图在 ObjectOpenedForModify 事件的处理程序中打开一个对象,否则AutoCAD就会不停地打开对象、打
开对象……