3、第一个TouchGFX项目:使用Designer创建空白项目、屏幕与画布概念、模拟器运行、生成代码并导入IDE

好,咱们正式开始动手了。

这一章的目标很简单——让你亲手跑起来第一个TouchGFX界面。哪怕你之前没接触过任何GUI框架,跟着走一遍,也能看到屏幕上出现你自己的第一个画面。

我个人习惯,学一个新工具时,先别管那么多理论,先让东西跑起来再说。有了感性认识,后面再讲概念你才记得住。

3.1 用Designer创建空白项目

打开TouchGFX Designer,你会看到一个启动界面。别被它吓到,其实核心操作就几步。

  1. 点击 “Create New Project”。
  2. 弹出一个对话框,让你选模板。我们选 “Empty UI”——空白项目,干干净净。
  3. 给项目起个名字,比如 MyFirstGUI。路径建议用默认的,或者放到一个你记得住的目录。
  4. 点击 “Create”,等几秒钟。

嗯,这里要注意:项目名不要带中文和空格。我之前有个同事用了中文名,结果编译时报了一堆莫名其妙的路径错误,排查了半天才发现是编码问题。

创建完成后,你会看到Designer的主界面。左边是组件面板,中间是画布,右边是属性面板。先别急着点,我们看看这个界面到底在说什么。

核心理解:TouchGFX Designer本质上是一个代码生成器。你在界面上拖拖拽拽,它背后帮你生成C++代码。所以,你看到的每一个控件、每一个屏幕,最终都会变成实实在在的代码文件。

3.2 屏幕与画布概念

很多初学者会把“屏幕”和“画布”搞混。我刚开始学的时候也迷糊过,这里给你讲清楚。

概念 含义 类比
屏幕(Screen) 一个完整的界面状态,包含多个控件和逻辑 就像手机上的一个页面
画布(Canvas) 屏幕内部的绘制区域,用于放置控件 就像画板上的白纸

说白了,一个屏幕可以包含多个画布,但一个画布只能属于一个屏幕。你想想看,手机上一个页面里可能有不同的区域——标题区、内容区、底部按钮区——每个区域都可以是一个画布。

在Designer里,默认创建的空项目已经有一个屏幕了,叫 Screen1。你可以在左侧的“Screens”面板里看到它。双击它可以重命名,但我建议先保持默认,等后面熟悉了再改。

我的经验:项目初期,尽量保持屏幕命名规范。比如用 MainScreen、SettingScreen 这样的名字,别用 Screen1、Screen2。等项目做到几十个屏幕时,你就知道命名规范有多重要了。

3.3 模拟器运行——第一次看到你的界面

好,现在我们来点最激动人心的操作——运行模拟器。

  1. 在Designer的右下角,找到 “Run Simulator” 按钮(一个绿色的播放图标)。
  2. 点击它,Designer会先编译你的项目(第一次会慢一点,别急)。
  3. 编译完成后,会自动弹出一个模拟器窗口。

你会看到一个空白的屏幕,背景是默认的深灰色。嗯,确实很“空”。但别失望,这证明你的开发环境已经全部打通了。

模拟器窗口有几个功能值得注意:

  • 鼠标拖拽:可以模拟触摸操作
  • 键盘快捷键:比如按 F1 可以查看帧率
  • 窗口缩放:可以调整模拟器大小,看看不同分辨率下的效果

我曾经在调试一个动画性能问题时,全靠模拟器的帧率显示来定位问题。所以这个 F1 快捷键,你最好记一下。

注意:模拟器跑的是你PC上的x86程序,不是ARM交叉编译。所以模拟器上的性能表现,只能作为参考。真正上硬件后,帧率可能会有明显差异。尤其是动画和图片解码,硬件上往往比模拟器慢不少。

3.4 生成代码并导入IDE

模拟器跑通了,接下来我们要把Designer生成的代码导入到真正的IDE里,这样才能编译成嵌入式固件。

3.4.1 生成代码

在Designer里,点击菜单栏的 “File” → “Generate Code”,或者直接按快捷键 Ctrl+G。

Designer会在你的项目目录下生成一堆文件。核心目录结构是这样的:

MyFirstGUI/
├── assets/               # 资源文件(图片、字体等)
├── generated/            # Designer自动生成的代码
│   ├── gui/              # 界面相关代码
│   └── touchgfx/         # TouchGFX框架核心
├── src/                  # 用户自定义代码
├── target/               # 硬件平台相关配置
└── MyFirstGUI.touchgfx   # 项目配置文件

这里我要强调一下:千万不要手动修改 generated/ 目录下的文件。因为每次你在Designer里修改界面并重新生成代码,这个目录都会被覆盖。我之前有个项目,同事直接在 generated/ 里改了布局代码,结果Designer一重新生成,他的修改全没了,白干半天。

3.4.2 导入到IDE

TouchGFX官方推荐使用 STM32CubeIDE 或者 Keil MDK。我这里以STM32CubeIDE为例,因为它是免费的,而且和TouchGFX集成得最好。

  1. 打开STM32CubeIDE,选择 “File” → “Import”。
  2. 选择 “General” → “Existing Projects into Workspace”。
  3. 浏览到你刚才生成的项目目录,选中 MyFirstGUI 文件夹。
  4. 点击 “Finish”,项目就会被导入。

导入后,你会看到项目结构里多了一些IDE相关的配置文件。别慌,这些都是自动生成的。

小技巧:如果你用的是Keil,导入方式类似。但要注意,Keil项目文件(.uvprojx)可能不在根目录,而是在 target/ 目录下。我第一次用Keil时找了半天项目文件,后来才发现它在 target/Keil/ 里。

3.4.3 编译与下载

在IDE里,直接点击编译按钮。如果一切顺利,你会看到控制台输出 Build Finished,没有错误。

然后连接你的开发板(比如STM32F429 Discovery Kit),点击下载按钮。等几秒钟,开发板上的屏幕就会亮起来,显示你在Designer里看到的那个空白界面。

嗯,虽然还是空白的,但这是你自己亲手跑起来的第一个嵌入式GUI程序。成就感应该还是有的。

关键流程总结:

Designer设计界面 → 生成代码 → IDE编译 → 下载到硬件 → 屏幕显示

这个流程,后面每一章都会重复。所以现在把它刻在脑子里。

3.5 本章知识体系

为了让你更直观地理解这一章的内容结构,我画了一张流程图。

第一个TouchGFX项目流程 第一个TouchGFX项目:从创建到运行 创建空白项目 理解屏幕与画布概念 模拟器运行验证 生成代码 (Ctrl+G) 导入IDE并编译下载 关键提醒 • 不要手动修改generated/ • 项目名不要带中文空格 • 模拟器性能≠硬件性能 常用快捷键 • Ctrl+G:生成代码 • F1:模拟器帧率 • Ctrl+S:保存项目

这张图把我们从创建项目到硬件运行的完整路径串起来了。你跟着箭头走一遍,就是整个开发流程。后面每一章的内容,都会在这个流程的某个环节上深入展开。

3.6 避坑指南

最后,分享几个我实际踩过的坑,你遇到了可以少走弯路。

  • 路径问题:项目路径不要有中文、空格、特殊字符。我见过最离谱的是路径里带了个“&”符号,编译直接报语法错误,排查了两小时。
  • 版本匹配:TouchGFX Designer、STM32CubeIDE、硬件固件包,这三者的版本要匹配。官方有版本兼容性表格,生成项目前最好看一眼。
  • 模拟器闪退:如果模拟器启动后立刻闪退,八成是显卡驱动问题。更新一下显卡驱动,或者把模拟器的渲染模式从OpenGL切换到Software。
  • 代码生成失败:如果点击Generate Code后报错,先检查项目里有没有未保存的修改。Designer有时候会因为你没保存而拒绝生成。

好了,这一章的内容就到这里。你现在应该已经成功跑起来了第一个TouchGFX项目,并且理解了屏幕、画布、模拟器、代码生成这几个核心概念。这些东西是后面所有章节的基础,务必亲手操作一遍,光看是记不住的。