Futurebasic/语言/参考/handleevents
HANDLEEVENTS
HANDLEEVENTS
执行许多影响用户体验的重要功能。它检查系统事件队列以及 FutureBasic 的内部事件队列,以查看是否发生了任何针对您的程序的最新事件,而这些事件尚未处理。如果发现任何此类事件,HANDLEEVENTS
会将它们从队列中删除并对其做出响应。HANDLEEVENTS
还执行将控制权转交给进程管理器的重要功能。进程管理器负责监督您 Macintosh 上所有进程的执行;一旦获得控制权,进程管理器可能会允许另一个应用程序运行一段时间,然后再将控制权返回您的应用程序。
HANDLEEVENTS
通过调用您在程序中指定的函数来响应某些类型的用户操作。它以预定的“自动”方式响应其他类型的用户操作。
“自动”响应 by HANDLEEVENTS
- 允许进程管理器将另一个进程带到最前面,如果用户已在应用程序菜单中选择它或单击了它的窗口之一。
- 如果用户单击了菜单栏,则打开菜单并跟踪选择。
- 激活一个非活动窗口,如果用户单击了该窗口的结构区域(例如,它的标题栏)。(如果窗口的
_keepInBack
属性已设置,则此操作将被禁止。) - 处理活动窗口的拖动和调整大小。
- 在当前活动编辑字段(如果有)中执行鼠标点击和按键的“标准”处理。
- 突出显示并跟踪单击时各种对象(例如,按钮、窗口关闭框等)。
- 对于任何需要更新的窗口:重新绘制所有按钮、滚动条、编辑字段和图片字段(除非窗口的
_noAutoClip
功能已设置)。还会重新绘制窗口结构区域的某些部分。 - 如果用户按下 cmd-period,并且没有标识
ON BREAK FN
函数,那么HANDLEEVENTS
将显示一个对话框,询问用户是否要停止或继续。如果用户选择停止,FB 然后调用您指定的ON STOP FN
函数(如果有),然后停止程序。
注意:您可以在系统事件处理函数中捕获低级事件(尤其是 _mButDwnEvt
事件)来禁止和/或更改这些响应。有关更多详细信息,请参见下文。
“程序化”响应 by HANDLEEVENTS
有许多种常见的用户操作,例如按钮点击和菜单选择,您将希望使用程序语句明确处理。当您编写一个用于处理特定类型事件的函数时,您通过执行类似于 ON DIALOG FN <functionName>
或 ON MENU FN <functionName>
的语句来将其指定为事件处理函数。一旦您以这种方式指定了您的事件处理函数,HANDLEEVENTS
将检查最近的用户操作,以确定其中是否有任何是您的函数可以处理的类型。如果发现任何此类事件,HANDLEEVENTS
将为每个此类事件调用相应的事件处理函数一次。请参阅各种 ON <eventType>
语句的描述,了解可以处理哪些类型的用户操作。
如果您没有标识要处理特定类别的用户操作的函数,那么 HANDLEVENTS
将忽略该类别的操作。例如,如果您没有使用 ON DIALOG
语句标识任何函数,那么 HANDLEVENTS
将忽略按钮点击和其他类似的操作。但是,HANDLEVENTS
仍然会执行上面列出的“自动”响应。
拦截系统事件 有时您可能需要对 HANDLEEVENTS
如何响应某些事件进行更精细的控制。例如,您可能希望禁止或更改 HANDLEEVENTS
通常执行的一些“自动”响应。为此,您应该使用 ON EVENT
语句将您的某个函数指定为“系统事件处理函数”。一旦您指定了这样的函数,HANDLEEVENTS
将首先调用该函数,然后再执行任何“自动”响应,然后再调用您可能已指定的任何其他事件处理函数。HANDLEVENTS
会将系统事件传递给您的函数(如果队列中有事件),或者将“空事件”传递给您的函数(如果队列中没有事件)。
您的系统事件处理函数返回后,HANDLEEVENTS
会继续处理同一个事件,除非它是空事件。根据事件的类型,HANDLEEVENTS
可能会执行一些“自动”响应,或者它可能会调用另一个事件处理函数。如果您不希望 HANDLEEVENTS
在您的系统事件处理函数退出后继续处理该事件,那么您需要“欺骗”FB,让它认为该事件是空事件。您可以在您的系统事件处理函数中,在处理完事件后执行以下类似的行
theEvent&.evtNum% = _nullEvt
其中 theEvent&
是指向事件记录的指针。
为了向用户提供对操作的快速响应,并与其他进程共享执行时间,您的程序应尽可能频繁地调用 HANDLEEVENTS
。大多数设计良好的程序都包含一个“主事件循环”,该循环在程序执行期间反复调用 HANDLEEVENTS
,允许 HANDLEEVENTS
在事件发生时调用各种事件处理函数。
ON DIALOG; MENU; MOUSE; TEKEY