事件
组件事件来源于 LCUI 的核心事件,当核心事件触发时,组件系统中的相关事件处理器会对其进行处理,然后转换成组件事件派发给对应的组件。
组件事件与核心事件的区别在于事件的种类和事件对象的内容,事件种类包括悬停、单击、双击、焦点等事件,而事件对象则包含了关联的组件和事件冒泡控制。
事件对象
首先,让我们看看组件事件对象在 include/LCUI/gui/widget_event.h 文件中的定义:
typedef struct LCUI_WidgetEventRec_ {
uint32_t type;
void *data;
LCUI_Widget target;
LCUI_BOOL cancel_bubble;
union {
LCUI_WidgetMouseMotionEvent motion;
LCUI_WidgetMouseButtonEvent button;
LCUI_WidgetMouseWheelEvent wheel;
LCUI_WidgetKeyboardEvent key;
LCUI_WidgetTouchEvent touch;
LCUI_WidgetTextInputEvent text;
};
} LCUI_WidgetEventRec, *LCUI_WidgetEvent;
我们可以发现,组件事件对象与核心事件对象的结构相似,只是多了 target
和 cacnel_buble
成员:
target
成员指向的是事件触发时的组件,当你想让多个组件在事件发生时执行某些操作而给它们设置相同的事件处理器时,target
非常有用,例如,有 16 个按钮,按钮被点击时会更改文本,那么在事件处理器中,target
指向的就是当前被点击的按钮,你只需要修改它的文本即可,无需用复杂的方式去获取它。-
cancel_bubble
成员用于标识是否取消该事件的冒泡,将它赋值为 TRUE 时,该事件对象不会冒泡到父级组件。