2B. 基类对象 API
概念说明
在 GT-HMI Engine 中,所有控件(屏幕、按钮、标签、滑动条……)共享一套通用能力:位置、尺寸、透明度、背景色、滚动、焦点等。Engine 将这些共性抽到一个基础结构体 gt_obj_st 中(定义于 src/widgets/gt_obj.h),控件在此基础上扩展各自的功能。
Engine 用 C 语言的 struct 嵌套实现继承——每个控件结构体的第一个成员就是 gt_obj_st:
// 以按钮为例(src/widgets/gt_btn.c)
typedef struct _gt_btn_s {
gt_obj_st base; // 基类对象(第一个成员)
_gt_vector_st * contents; // 按钮特有:状态文本列表
gt_color_t color_pressed; // 按钮特有:按下颜色
gt_color_t font_color; // 按钮特有:字体颜色
// ... 其他按钮专有字段
} _gt_btn_st;
由于 base 是结构体第一个成员,指向 _gt_btn_st 的指针可以直接转为 gt_obj_st *,因此所有基类函数(gt_obj_set_pos、gt_obj_set_opa 等)都能作用于任何控件类型。
控件通过 gt_obj_class_create() 统一创建,每个控件注册一个类描述表 gt_obj_class_st(定义于 src/widgets/gt_obj_class.h),其中包含初始化回调、事件回调、类型枚举和控件专属尺寸:
// 按钮的类描述表(src/widgets/gt_btn.c)
static const gt_obj_class_st gt_btn_class = {
._init_cb = _btn_init_cb, // 初始化时调用
._event_cb = _btn_event_cb, // 事件处理时调用
.type = GT_TYPE_BTN, // 控件类型标识
.size_style = sizeof(_gt_btn_st) // 控件专属结构体的内存大小
};
一句话总结:gt_obj_st 是所有控件的公共部分,基类 API 就是操作这些公共部分的函数。你可以在任何控件上使用它们,因为任何控件都以 gt_obj_st 开头。
如何使用本页
以下函数按功能分组列出,所有函数对一切控件通用。例如 gt_obj_set_pos(obj, 100, 200) 可以设置按钮的坐标,也可以设置标签的坐标——传入对应控件对象即可。
创建与销毁
对象生命周期的起点和终点。"创建"产生一个新控件,"销毁"将其从界面移除。
| 函数 | 说明 |
|---|---|
gt_obj_st * gt_obj_create(gt_obj_st * parent) | 创建对象。parent 为 NULL 时创建屏幕 |
void gt_obj_destroy(gt_obj_st * obj) | [安全] 销毁对象(延迟释放,避免回调中释放自身) |
void gt_obj_destroy_immediately(gt_obj_st * obj) | [不安全] 立即销毁对象 |
父子关系
对象以树状结构组织:一个屏幕可以包含按钮、标签,按钮又可以包含图标。这些函数用来查询和操作对象的归属关系。
| 函数 | 说明 |
|---|---|
gt_obj_st * gt_obj_get_parent(gt_obj_st * obj) | 获取父对象 |
gt_obj_st * gt_obj_change_parent(gt_obj_st * obj, gt_obj_st * to) | 更换父对象(to 不能为 NULL) |
bool gt_obj_is_child(gt_obj_st * obj, gt_obj_st * parent) | 判断是否为指定父对象的子对象 |
uint16_t gt_obj_get_child_index(gt_obj_st * parent, gt_obj_st * obj) | 获取子对象索引,失败返回 0xFFFF |
gt_obj_st * gt_obj_search_child_by_type(gt_obj_st * parent, gt_obj_type_et type) | 按类型搜索子对象 |
gt_obj_st * gt_obj_search_child_by_id(gt_obj_st * parent, gt_id_t id) | 按 ID 搜索子对象 |
gt_res_t gt_obj_bring_to_front(gt_obj_st * obj) | 将对象移到父容器最上层 |
gt_obj_st * gt_obj_within_which_scr(gt_obj_st * obj) | 获取对象所属的屏幕对象 |
ID 管理
| 函数 | 说明 |
|---|---|
void gt_obj_register_id(gt_obj_st * obj, gt_id_t id) | 注册对象 ID(id >= 0),默认值为 -1(无效) |
gt_id_t gt_obj_get_id(gt_obj_st * obj) | 获取对象 ID |
gt_obj_st * gt_obj_find_by_id(gt_id_t widget_id) | 按 ID 查找全局对象 |
坐标与尺寸
设置和获取对象的位置(x, y)与大小(宽, 高)。支持绝对坐标、相对坐标、动画移动、按步进调整等多种方式。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_pos(gt_obj_st * obj, gt_size_t x, gt_size_t y) | 设置坐标 | — |
void gt_obj_set_pos_anim(gt_obj_st * obj, gt_size_t x, gt_size_t y) | 带动画设置坐标 | — |
void gt_obj_set_pos_step(gt_obj_st * obj, gt_size_t step_x, gt_size_t step_y) | 按步进值调整坐标 | — |
void gt_obj_set_pos_relative(gt_obj_st * obj, gt_obj_st * target, gt_size_t diff_x, gt_size_t diff_y) | 相对目标对象设置坐标。target=NULL 时相对于父对象 | — |
void gt_obj_set_x(gt_obj_st * obj, gt_size_t x) | 设置 X 坐标 | — |
void gt_obj_set_y(gt_obj_st * obj, gt_size_t y) | 设置 Y 坐标 | — |
void gt_obj_set_size(gt_obj_st * obj, uint16_t w, uint16_t h) | 设置宽度和高度 | — |
void gt_obj_set_size_anim(gt_obj_st * obj, uint16_t w, uint16_t h) | 带动画设置尺寸 | — |
void gt_obj_set_w(gt_obj_st * obj, uint16_t w) | 设置宽度 | — |
void gt_obj_set_h(gt_obj_st * obj, uint16_t h) | 设置高度 | — |
gt_size_t gt_obj_get_x(gt_obj_st * obj) | 获取 X 坐标 | — |
gt_size_t gt_obj_get_y(gt_obj_st * obj) | 获取 Y 坐标 | — |
uint16_t gt_obj_get_w(gt_obj_st * obj) | 获取宽度 | — |
uint16_t gt_obj_get_h(gt_obj_st * obj) | 获取高度 | — |
外观
控制对象视觉呈现:透明度(可实现淡入淡出)、圆角半径、背景色等。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_opa(gt_obj_st * obj, gt_opa_t opa) | 设置透明度。范围 0(全透明)~ 255(不透明) | 255 |
gt_anim_st * gt_obj_set_opa_anim(gt_obj_st * obj, gt_opa_t opa) | 带动画设置透明度,返回动画对象 | — |
void gt_obj_set_radius(gt_obj_st * obj, gt_radius_t radius) | 设置圆角半径(像素) | 0 |
void gt_obj_set_radius_anim(gt_obj_st * obj, gt_radius_t radius) | 带动画设置圆角 | — |
void gt_obj_set_bgcolor(gt_obj_st * obj, gt_color_t color) | 设置背景颜色 | — |
gt_color_t gt_obj_get_bgcolor(gt_obj_st * obj) | 获取背景颜色 | — |
void gt_obj_show_bg(gt_obj_st * obj, bool show) | 是否显示背景颜色。false 时 bgcolor 不可见 | false |
bool gt_obj_is_show_bg(gt_obj_st * obj) | 获取背景显示状态 | — |
void gt_screen_set_bgcolor(gt_obj_st * obj, gt_color_t color) | 设置屏幕背景颜色(仅屏幕对象) | — |
gt_color_t gt_screen_get_bgcolor(gt_obj_st * obj) | 获取屏幕背景颜色 | — |
可见性与交互
控制对象是否在屏幕上显示(可见/隐藏)、是否响应用户操作(启用/禁用)、是否可触摸,以及触摸事件是否传递给父对象。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_visible(gt_obj_st * obj, gt_visible_et is_visible) | 设置可见性:GT_VISIBLE 或 GT_INVISIBLE | GT_VISIBLE |
gt_visible_et gt_obj_get_visible(gt_obj_st * obj) | 获取可见状态 | — |
void gt_obj_set_disabled(gt_obj_st * obj, gt_disabled_et is_disabled) | 启用/禁用控件:GT_ENABLED 或 GT_DISABLED | GT_ENABLED |
bool gt_obj_is_disabled(gt_obj_st * obj) | 获取禁用状态 | — |
void gt_obj_set_untouchability(gt_obj_st * obj, bool is_untouchability) | 设置控件是否可触摸。true=不可触摸 | false |
bool gt_obj_is_untouchability(gt_obj_st * obj) | 获取不可触摸状态 | — |
void gt_obj_set_touch_parent(gt_obj_st * obj, bool is_touch_parent) | 触摸事件传递给父对象 | false |
bool gt_obj_get_touch_parent(gt_obj_st * obj) | 获取触摸传递状态 | — |
状态
控件的交互状态管理:选中/未选中、触发模式(按住触发 vs 点击切换)、遮罩效果等。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_state(gt_obj_st * obj, gt_state_et state) | 设置选中状态:GT_STATE_NONE 或 GT_STATE_PRESSED | GT_STATE_NONE |
gt_state_et gt_obj_get_state(gt_obj_st * obj) | 获取选中状态 | — |
void gt_obj_set_trigger_mode(gt_obj_st * obj, gt_obj_trigger_mode_et mode) | 状态切换模式:GT_OBJ_TRIGGER_MODE_HOLD_ON(按住)或 GT_OBJ_TRIGGER_MODE_SWITCH(切换) | HOLD_ON |
void gt_obj_set_mask_effect(gt_obj_st * obj, bool is_keep_alive) | 选中状态时启用遮罩效果 | false |
bool gt_obj_get_mask_effect(gt_obj_st * obj) | 获取遮罩效果状态 | — |
滚动
当对象内容超出可视区域时,控制滚动行为:滚动方向、对齐方式、惯性效果、滚动提示条等。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_scroll_dir(gt_obj_st * obj, gt_scroll_dir_et dir) | 滚动方向:GT_SCROLL_DISABLE / GT_SCROLL_HORIZONTAL / GT_SCROLL_VERTICAL / GT_SCROLL_ALL | GT_SCROLL_ALL |
gt_scroll_dir_et gt_obj_get_scroll_dir(gt_obj_st * obj) | 获取滚动方向 | — |
void gt_obj_set_scroll_snap_x(gt_obj_st * obj, gt_scroll_snap_em snap) | 水平滚动对齐:GT_SCROLL_SNAP_NONE / START / END / CENTER | GT_SCROLL_SNAP_NONE |
void gt_obj_set_scroll_snap_y(gt_obj_st * obj, gt_scroll_snap_em snap) | 垂直滚动对齐:同上可选值 | GT_SCROLL_SNAP_NONE |
void gt_obj_set_scroll_lr(gt_obj_st * obj, bool is_scroll_right) | 设置水平滚动方向:false=左滚,true=右滚 | — |
void gt_obj_set_scroll_ud(gt_obj_st * obj, bool is_scroll_down) | 设置垂直滚动方向:false=上滚,true=下滚 | — |
void gt_obj_set_scroll_tip(gt_obj_st * obj, gt_scroll_tip_et mode) | 滚动提示条位置:GT_SCROLL_TIP_NONE / LEFT / RIGHT / TOP / BOTTOM | GT_SCROLL_TIP_NONE |
void gt_obj_set_scroll_tip_always(gt_obj_st * obj, bool always) | 滚动提示条常显。false=自动隐藏 | false |
void gt_obj_set_rebound(gt_obj_st * obj, bool enabled) | 滚动回弹效果 | false |
void gt_obj_set_ignore_throw(gt_obj_st * obj, bool is_ignore_throw) | 忽略滚动惯性(立即停止) | false |
布局相关
控制对象在父容器中的布局行为:是否固定在屏幕上(不跟随滚动)、是否裁剪超出内容、子控件横向排列等。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_fixed(gt_obj_st * obj, bool is_fixed) | 锁定对象位置。锁定后不跟随父容器滚动 | false |
bool gt_obj_get_fixed(gt_obj_st * obj) | 获取锁定状态 | — |
void gt_obj_set_overflow(gt_obj_st * obj, bool is_overflow) | 允许控件尺寸超出屏幕范围独立滑动 | false |
bool gt_obj_get_overflow(gt_obj_st * obj) | 获取溢出状态 | — |
void gt_obj_set_inside(gt_obj_st * obj, bool is_inside) | 控件仅在父区域内显示(裁剪) | false |
bool gt_obj_get_inside(gt_obj_st * obj) | 获取裁剪状态 | — |
void gt_obj_set_virtual(gt_obj_st * obj, bool is_virtual) | 虚拟控件标志。true=不可接收触摸 | false |
void gt_obj_set_row_layout(gt_obj_st * obj, bool is_row_layout) | 子控件横向排列 | false |
void gt_obj_set_grow_invert(gt_obj_st * obj, bool is_grow_invert) | 横向排列时反向增长 | false |
焦点相关
焦点是当前被选中的对象(通常用物理按键或触摸切换)。焦点框是一个高亮边框,指示当前活跃控件。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_focus(gt_obj_st * obj, bool is_focus) | 设置焦点状态 | false |
bool gt_obj_is_focus(gt_obj_st * obj) | 获取焦点状态 | — |
void gt_obj_set_focus_disabled(gt_obj_st * obj, gt_disabled_et is_disabled) | 禁用焦点 | GT_ENABLED |
void gt_obj_set_focus_skip(gt_obj_st * obj, bool is_skip) | 焦点跳过当前对象直接到子对象 | false |
void gt_obj_set_focus_w(gt_obj_st * obj, uint8_t focus_w) | 焦点框边框宽度(像素) | 2 |
void gt_obj_set_focus_gap(gt_obj_st * obj, uint8_t focus_gap) | 焦点框与控件间距(像素) | 0 |
事件通知
事件冒泡:子对象的触摸事件是否向上传递给父对象。手势滑动方向事件:检测用户的滑动方向。
| 函数 | 说明 | 默认值 |
|---|---|---|
void gt_obj_set_bubble_notify(gt_obj_st * obj, bool is_bubble_notify) | 对象事件冒泡通知父对象 | false |
bool gt_obj_is_bubble_notify(gt_obj_st * obj) | 获取冒泡通知状态 | — |
void gt_obj_set_swipe_dir(gt_obj_st * obj, bool enabled) | 启用手势滑动方向事件(需配合 GT_EVENT_TYPE_SWIPE_*) | false |
条件编译特性
以下 API 仅在对应宏定义开启时可用。
| 条件宏 | API | 说明 |
|---|---|---|
GT_USE_CUSTOM_TOUCH_EXPAND_SIZE | void gt_obj_set_touch_expand_area(gt_obj_st * obj, gt_size_t hor, gt_size_t ver) | 设置触摸扩展区域 |
GT_USE_WIDGET_DYNAMIC_FRAME_RATE | void gt_obj_set_frame_rate(gt_obj_st * obj, gt_obj_frame_rate_et frame_rate) | 设置动态帧率:GT_OBJ_FRAME_RATE_HIGH / MIDDLE / LOW |
获取滚动限制
| 函数 | 说明 |
|---|---|
gt_size_t gt_obj_get_limit_right(gt_obj_st * obj) | 获取子对象最大右边界 |
gt_size_t gt_obj_get_limit_bottom(gt_obj_st * obj) | 获取子对象最大下边界 |
gt_point_st gt_obj_calc_scroll_limit(gt_obj_st * parent) | 计算可滚动的最大距离 |
颜色透明度常量
定义于
gt_color.h,配合gt_obj_set_opa()使用。
| 常量 | 值 | 说明 |
|---|---|---|
GT_OPA_0 | 0 | 全透明 |
GT_OPA_10 | 25 | 10% 不透明 |
GT_OPA_20 | 51 | 20% |
GT_OPA_30 | 76 | 30% |
GT_OPA_40 | 102 | 40% |
GT_OPA_50 | 127 | 50% |
GT_OPA_60 | 153 | 60% |
GT_OPA_70 | 178 | 70% |
GT_OPA_80 | 204 | 80% |
GT_OPA_90 | 229 | 90% |
GT_OPA_COVER | 255 | 完全不透明 |

