4. TouchGFX Designer核心操作

TouchGFX Designer 是复杂 HMI 项目从“视觉设计”走向“可运行固件”的中枢工具。它并不是一个单纯的 UI 画图软件,而是把画布布局、控件属性、交互行为、屏幕组织、自定义容器以及代码生成与工程同步串成一条闭环链路。理解这条链路,才能避免“界面画得漂亮、代码却无法维护”的常见困境。

一、画布与坐标系:布局的基准面

Designer 的画布对应目标屏幕的物理像素区域,通常以左上角为原点,X 向右、Y 向下。画布尺寸必须与目标显示屏分辨率一致,否则会出现裁剪或黑边。画布中每个控件都有位置、尺寸、层级和可见性四个基础属性。层级决定遮挡关系,后添加的控件默认在上层,可通过“置顶/置底”调整。

画布还提供网格与对齐辅助线,用于快速对齐多个控件。对于复杂 HMI,建议先规划区域:状态栏、主内容区、底部导航区,再在区域内放置控件,而不是逐个控件随意拖拽。这样生成的代码结构更清晰,后续维护成本更低。

画布尺寸、颜色深度和屏幕方向一旦确定,后期修改会牵动所有屏幕的坐标与资源,因此应在项目初期与硬件选型同步确认。

二、控件与交互:从静态元素到可响应行为

Designer 提供按钮、文本、图像、进度条、滑动条、列表、时钟等常用控件。控件本身是静态的,交互才是让界面“活起来”的关键。交互通过“触发器 + 动作”定义,例如:按钮被点击时切换到某屏幕、滑动条值改变时更新文本、定时器触发时刷新数据。

交互配置的核心是明确三件事:谁触发、触发什么、触发后做什么。Designer 中常见的触发器包括 Clicked、ValueChanged、Pressed、Released、Timer 等;动作包括 ChangeScreen、SetValue、CallNewVirtualFunction、StartTimer 等。对于需要业务逻辑的交互,应使用“虚函数”把控制权交给手写 C++ 代码,而不是把所有逻辑都塞进 Designer 配置里。

// 在 Designer 中为按钮添加交互:
// Trigger: Clicked
// Action: CallNewVirtualFunction -> handleStartClicked()

void Screen1View::handleStartClicked()
{
    // 业务逻辑:启动采集、更新模型、切换状态
    presenter->startAcquisition();
}

三、屏幕与自定义容器:复杂 HMI 的组织方式

屏幕(Screen)是 Designer 中的顶层视图单元,通常对应一个完整页面。复杂项目往往有几十个屏幕,如果每个屏幕都从零搭建,重复劳动极大。自定义容器(Custom Container)正是为解决复用问题而设计:把一组控件和交互封装成可复用的组件,例如顶部状态栏、参数卡片、报警列表项。

自定义容器可以像普通控件一样被拖入任意屏幕,并暴露属性供外部配置。它的内部逻辑与外部屏幕解耦,修改容器只需改一处,所有引用它的屏幕都会同步更新。这是复杂 HMI 保持可维护性的关键手段。

TouchGFX Designer 核心操作链路 画布 Canvas 分辨率 / 坐标 / 层级 网格 / 对齐 / 区域规划 背景 / 可见性 控件 Widgets 按钮 / 文本 / 图像 进度条 / 滑动条 / 列表 属性 / 样式 / 资源 交互 Interactions 触发器 Trigger 动作 Action 虚函数回调 屏幕 Screen 页面切换 生命周期 自定义容器 封装控件 + 交互 暴露属性 / 复用 状态栏 / 卡片 / 列表项 代码生成 Generate Code View / Presenter / Base 自动生成 + 手写扩展 工程同步 Designer ↔ 工程文件 资源 / 字体 / 图片 版本管理 / 增量编译 修改设计 → 重新生成 → 同步工程 → 编译验证(闭环迭代)

四、代码生成与工程同步:设计到固件的桥梁

Designer 的“Generate Code”会把画布、控件、交互和屏幕配置翻译成 C++ 代码。生成结果通常分为两类:一类是自动生成、不应手动修改的 Base 文件;另一类是供开发者编写业务逻辑的 View/Presenter 文件。理解这个边界非常重要:Base 文件会在每次生成时被覆盖,手写逻辑必须放在非 Base 文件中。

工程同步则解决“Designer 与 IDE 工程如何保持一致”的问题。Designer 负责 UI 资源与视图结构,IDE 负责编译、链接和烧录。每次在 Designer 中新增屏幕、控件或资源后,都需要重新生成代码,并让 IDE 工程识别新增文件。常见做法是保持工程目录结构稳定,把生成文件放在固定路径,避免手动移动。

操作环节 核心对象 关键动作 常见风险
画布 分辨率、坐标、层级 区域规划、对齐、背景设置 尺寸不匹配导致裁剪
控件 按钮、文本、图像、列表 拖拽、属性配置、资源绑定 资源缺失或命名冲突
交互 触发器、动作、虚函数 配置触发条件与回调 逻辑塞进配置,难以维护
屏幕 Screen、切换、生命周期 页面组织、跳转关系 屏幕过多导致结构混乱
自定义容器 可复用组件 封装、暴露属性、复用 过度封装导致耦合
代码生成 Base / View / Presenter 生成、扩展、编译 误改 Base 文件被覆盖
工程同步 Designer 与 IDE 工程 资源同步、增量编译 新增文件未加入工程

五、案例与复盘:一个参数设置页的完整链路

假设要做一个“参数设置页”:顶部是标题栏,中间是三个参数卡片,底部是保存按钮。合理做法是:先把标题栏做成自定义容器,把参数卡片做成另一个自定义容器并暴露“参数名、当前值、单位”三个属性;然后在设置屏幕中拖入三个卡片实例,分别配置属性;保存按钮的 Clicked 交互绑定到虚函数,在 View 中读取卡片值并写入模型。

常见误区有三个:第一,把所有控件直接堆在屏幕上,导致后续改样式要逐个修改;第二,把业务逻辑写进 Designer 的交互动作里,生成代码后难以调试;第三,修改了 Base 文件,下一次生成代码时被覆盖,造成“代码莫名丢失”。复盘时应检查:是否使用了自定义容器、是否把逻辑放在非 Base 文件、是否在每次生成后确认工程文件已同步。

每次点击 Generate Code 前,先确认当前修改已保存,并检查是否有未提交的 Base 文件改动。生成后优先编译一次,确认没有文件缺失或符号冲突,再继续开发。

掌握画布、控件、交互、屏幕、自定义容器、代码生成与工程同步这条完整链路,TouchGFX Designer 就不再只是“画界面”的工具,而是复杂 HMI 项目可持续迭代的工程化入口。