跳转到内容

Futurebasic/语言/参考/handleevents

来自维基教科书,自由的教科书

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

华夏公益教科书