控件事件 (COM)

除了提供属性和方法外,控件还提供传出接口来通知其客户端的事件。 客户端必须支持处理这些事件。 有关可连接对象如何工作的详细信息,请参阅 COM 和可连接对象中的事件

控件可以支持不同的传出接口,以实现不同的目的。 所有传出接口都标记为控件类型信息中的源接口,但只有一个被标记为默认接口,以指示它是主要传出接口。

容器可以支持控件定义的一个或多个传出接口。 控件应准备好处理仅对某些传出接口提供支持的容器。

控件支持四种类型的事件:

  • 请求事件。 控件通过调用传出接口中的方法请求其客户端执行某些操作的权限,从而触发请求事件。 客户端通过控件调用的方法中的布尔外参数向控件发出信号。 因此,客户端可以阻止控件执行该操作。
  • 之前事件。 控件通过调用传出接口中的方法来通知其客户端将执行某个操作,从而触发之前事件。 客户端没有机会阻止该操作,但鉴于操作即将执行,它可以执行任何必要的步骤。
  • 之后事件。 控件通过在传出接口中调用方法通知客户端刚执行了某个操作,从而触发之后事件。 同样,客户端无法取消此操作,但可以执行必要的步骤,因为操作已执行。
  • 执行事件。 控件触发执行事件,以允许其客户端覆盖控件的操作,并提供一些替代或补充操作。 通常,控件调用执行事件的方法具有许多参数,用于与客户端协商将执行的操作。

为控件可以支持的标准事件定义了以下 dispid:Click、DblClick、KeyDown、KeyPress、KeyUp、MouseMove、MouseUp 和 Error。 所有这些标准事件都具有负 DISPID 值,指示其标准状态。

使用 TRUE 调用时,IOleControl::FreezeEvents 方法会指示控件容器是否妨碍处理控件中的事件,直到使用 FALSE 再次调用 FreezeEvents。 在此期间,控制不能依赖于容器实际处理任何事件。 如果必须处理事件,则控件应将事件排入队列,以便在使用 FALSE 调用 FreezeEvents 时触发该事件。

ActiveX 控件