0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战经验 | TouchGFX 控件附加 ClickListener 功能的方法介绍

STM32单片机 来源:未知 2023-11-17 17:40 次阅读


关键词:GUI,TouchGFX,Mixin,ClickListener


目录预览

1、引言

2、TouchGFX ClickListener 模板的使用

3、小结


01

引言


TouchGFX 是专用于 STM32 的图形界面设计软件,可用来低成本开发优秀的图形界面,TouchGFX 现已变的越来越流行。为了帮助客户更加深入地理解和使用 TouchGFX ,本文介绍了 TouchGFX Designer 中的 Mixin 功能,从基础示例 Button Example 出发,为文本框控件添加 ClickListener (Mixin 功能中的一项),并对源代码进行简单剖析。期望能帮助客户更深入地理解 STM32 TouchGFX 的相关功能。


02

TouchGFX ClickListener 模板的使用


2.1. C++模板编程基础


在示例介绍之前,让我们先熟悉一下 C++模板编程的一些基础知识。模板编程属于通用编程的范畴,是为“尚未确定类型”所写的函数或类。是可以产生更干净、更快速、更精明的软件的一个强力手段。


模板的优点:首先模板与某种特定类型无关,代码可重用性好;其次模板与平台无关,代码移植性好;另外模板代码在编译时才进行解释,在编译时确定检查数据类型,相比运行时检查,类型的安全性高。


模板的缺点:一是代码易读性不是很好,调试不便;二是用户工程代码中需要包含模板代码(非二进制库),编译的时间较长,二进制扩展性差;另外有可能会造成二进制代码膨胀(编译后二进制代码臃肿),我们在设计模板时,需要尽可能将 C++模板中与参数⽆关的代码分离出来。


2.2. TouchGFX Mixin 功能简介


模板一般分为函数模板和类模板。函数模板我们这里不做赘述,重点关注 TouchGFX Mixins 类模板。TouchGFX 的 Mixins 类模板用于拓展控件的功能,目前 TouchGFX v4.20.0 中有四个 Mixin 功能,分别是 Draggable、ClickListener、FadeAnimator 和MoveAnimator,分别为控件增添相关功能。如图 1 (TouchGFX Designer Mixins 功能)所示,本文主要针对 ClickListener 做具体介绍。


图1. TouchGFX Designer Mixins 功能


2.3. 基于 TouchGFX Button 例程使用 ClickListener 功能


2.3.1. TouchGFX 例程的代码生成


运行 TouchGFX Designer,选择 Examples;通过 Select Board Setup 选择STM32H735G DK 板;从众多例程中选择“Button Example”例程;将 Application name 改为 Button_Example,如下图图 2,然后点击 Create 创建工程。


图2.TouchGFX Designer 生成 Button Example 例程


进入 TouchGFX Designer 主界面后,会看到画布上有两个按钮和一个文本框,我们对界面不做更改,直接选择 Designer 右下角 (Run Target)生成代码。该操作将会复制TouchGFX 框架文件,生成配置文件、makefile、代码及资源文件(images、fonts、texts),然后编译链接、烧录目标板并运行。程序运行起来后,您可以熟悉一下该按钮例程应用。下面我们就针对该例程,为界面上的计数文本框控件注入 ClickListener 功能,应用实现“当点击计数文本框时,计数数字增加 2”的功能。


2.3.2. 为计数文本框控件添加 ClickListener 功能


我们在 TouchGFX Designer 主屏界面,点击 countTxt 文本框,然后在右侧属性栏中找到 Mixins,勾选 ClickListener,如图 3 所示。然后重新生成代码。


图3.TouchGFX Designer, 计数文本框 mixin ClickListener 功能


我们可以使用 VS code 编辑代码,或使用其它如 STM32CubeIDE 等工具编辑代码。打开 MainView.hpp,为计数文本框,添加代码如下(黄底色部分):



然后我们转到 MainView.cpp 文件,首先将 txtClickedCallback 对象与 MainView的 cntTextClickHandler(文本框点击处理函数)绑定,这是在 MainView 类的构造函数中初始化列表中实现的。将 txtClickedCallback 加入初始化列表中,参数使用指向MainView 中 cntTextClickHandler 函数的函数指针。我们还需要修改 setupScreen 函数,在这里为 countTxt 添加 ClickAction,参数使用 txtClickedCallback, 以实现在主屏界面创建时,将 countTxt 文本框的点击事件与 txtClickedCallback 对象绑定在一起。另外我们还需要实现 cntTextClickHandler,具体代码如下:



修改完成后,保存,编译,运行。您将会发现当每次点击 countTxt 文本框时,文本框计数会增加 2。至此,我们已经实现了为文本框控件加入 ClickListener 的功能。大家可以看到,在 TouchGFX 应用中使用 ClickListener 类模板做开发是十分便捷的,代码量也较小。下面我们对代码进一步解读。


2.3.3. ClickListener 模板代码


ClickListener 类模板是 TouchGFX 框架的一部分,封装在 ClickListener.hpp 中,代码如下:



ClickListener 是一个标准的类模板。所谓类模板,就是“包含一个或多个尚未确定类型”的类。必须将具体类型当作模板参数传入,才可使用。当传入模板参数后,该类模板便以你所指定的参数类型,由编译器进行实例化。将具体类型传入到类模板进行实例化,我们会得到一个新的 ClickListener 类,转变为从传入参数(某待定的类)的派生类。


在生成的代码 MainViewBase.hpp 中(MainView 是 MainViewBase 的派生类),我们可以找到 countTxt 的声明:


touchgfx::ClickListener< touchgfx::TextAreaWithOneWildcard > countTxt;

这里,该模板示例类是从 TextAreaWithOneWildcard 类(即原计数文本框类型)继承下来的。如果您选择的不是为文本框增加 ClickListener 功能,而是其它控件,则新的ClickListener 实例类将派生自您所用的控件。本例中的继承关系如下:


该 ClickListener 实例类是 TextAreaWithOneWildcard 类的派生类,不仅仅继承了TextAreaWithOneWildcard 的属性与方法,另外还添加了一个 GenericCallback 指针变量clickAction,该指针由附加的 setClickAction 方法赋值。由另一个方法 handleClickEvent使用,在 handleClickEvent 中在响应 Click 事件时,会调用该 clickAction。(关于callback 类的使用,我们这里不做赘述,如果您需要进一步了解,请参考 TouchGFX 相关文档)。


2.3.4. ClickListener 模板应用


我们清楚了 ClickListener 类模板的原理后,回头来看例子中的 ClickListener 的应用代码,就会发现其逻辑十分清晰。


首先在 MainView.hpp 中声明了一个 Callback txtClickedCallback, 和一个事件处理函数 cntTextClickHandler。在 MainView.cpp 中初始化该 txtClickedCallback, 将其与cntTextClickHandler 关联,即实现当调用该 Callback 时,会转到 cntTextClickHandler 进行处理。


再在 setupScreen 函数中调用 ClickListener 类模板接口 setClickAction 将txtClickedCallback 的地址赋给 ClickListener 实例化类的 clickAction 指针。则ClickListener 实例化类(这里即 TextAreaWithOneWildcard 类的派生类)在处理ClickEvent 时就会执行到 txtClickedCallback 关联的处理函数 cntTextClickHandler


最后需要实现 MainView 类中的 Click 事件处理函数 cntTextClickHandler,这里的实现为:当 Click 事件类型为“Click 按键释放”时调用 increaseValue 函数两次。


03

小结


TouchGFX 是 STM32 专用的界面设计工具,功能强大且易用。本文选择了 Mixins 功能进行简介,从基础示例 Button Example 出发,动手添加 ClickListener (Mixin) 功能,并从源代码的角度浅析了 ClickListener 类模板的使用,助力客户更深入地理解 STM32 TouchGFX。




完整内容请点击“阅读原文”下载原文档。


原文标题:实战经验 | TouchGFX 控件附加 ClickListener 功能的方法介绍

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43983

    浏览量

    620891
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348855

原文标题:实战经验 | TouchGFX 控件附加 ClickListener 功能的方法介绍

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    touchgfx swipeContainer控件加入ScrollableContainer控件;SwipeContainer空间就用不了是哪里的问题?

    touchgfx 问题 :swipeContainer控件加入ScrollableContainer控件;SwipeContainer空间就用不了了,只能执行S
    发表于 03-22 11:48

    TouchGFX怎样任意修改控件大小?

    TouchGFX怎样任意修改控件大小,而不是只能选择固定的大小?
    发表于 03-18 07:17

    touchgfx如何改变图片颜色?

    touchgfx是否有提供函数可以直接改变image控件中图片的颜色,类似LVGL中图片控件的recolor函数,对图片重新着色成某种纯色图片,如果touchgfx没有这种函数,是否有
    发表于 03-15 06:24

    实战经验 | Keil、IAR、CubeIDE 中变量不被初始化方法

    关键词:不被初始化,编译环境 目录预览 1、前言 2、IAR 实现变量不初始化方法 3、Keil 实现变量不被初始化方法 4、CubeIDE 实现变量不初始化方法 01 前言 有些时候在我们的应用过
    的头像 发表于 11-24 18:05 1004次阅读

    docker微服务架构实战

    的容器化技术,为微服务架构的实施提供了强大的支持。本文将介绍Docker微服务架构的实战经验,包括Docker的概述、微服务架构的设计原则以及实际应用中的具体实践。 一、Docker概述 Docker是一个开源的容器化平台,可以用于构建、发布和运
    的头像 发表于 11-23 09:26 316次阅读

    TouchGFX开发(3)----使用TouchGFX配置IIC接口OLED

    TouchGFX开发(3)----使用TouchGFX配置IIC接口OLED
    的头像 发表于 11-09 15:31 866次阅读
    <b class='flag-5'>TouchGFX</b>开发(3)----使用<b class='flag-5'>TouchGFX</b>配置IIC接口OLED

    实战经验 | STM32GUI TouchGFX 屏幕切换功能简介

    关键词:GUI,TouchGFX,Transition 目录预览 1、引言 2、TouchGFX屏幕切换功能 3、小结 01 引言 TouchGFX 是专用于 STM32 的图形界面设
    的头像 发表于 11-09 10:05 1784次阅读

    TouchGFX从旧版本更新到新版本的方法

    X-CUBE-TOUCHGFX 是 STM32Cube 生态系统的一个软件包,它包含以下组件:TouchGFX Designer,TouchGFX Generator 和 TouchGFX
    的头像 发表于 11-01 17:15 594次阅读
    <b class='flag-5'>TouchGFX</b>从旧版本更新到新版本的<b class='flag-5'>方法</b>

    实战经验 | TouchGFX从旧版本更新到新版本的方法

    TouchGFX 不断进行软件版本更新,其提供的功能也越来越丰富,有些新的功能只有更新的版本才有,所以很多时候会面临将旧版本的 TouchGFX 迁移到更新版本的问题。在创建
    的头像 发表于 11-01 17:15 388次阅读

    基于 TouchGFX 生成的代码中添加触摸功能方法

    基于 TouchGFX 生成的代码中添加触摸功能方法
    的头像 发表于 10-27 09:21 573次阅读
    基于 <b class='flag-5'>TouchGFX</b> 生成的代码中添加触摸<b class='flag-5'>功能</b>的<b class='flag-5'>方法</b>

    如何添加触摸屏驱动到TouchGFX中?

    使用STM32CubeMX移植TouchGFX 一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有触摸的功能。下面将介绍如何添加
    的头像 发表于 10-09 14:41 1068次阅读

    STM32GUI使用TouchGFX动态图片功能实现动态更换表盘背景功能

    电子发烧友网站提供《STM32GUI使用TouchGFX动态图片功能实现动态更换表盘背景功能.pdf》资料免费下载
    发表于 09-19 16:54 3次下载
    STM32GUI使用<b class='flag-5'>TouchGFX</b>动态图片<b class='flag-5'>功能</b>实现动态更换表盘背景<b class='flag-5'>功能</b>

    TouchGFX如何才能任意修改控件大小?

    TouchGFX怎样任意修改控件大小,而不是只能选择固定的大小?
    发表于 08-07 11:27

    时序签核方法学及实战经验

    其中的Operating Mode,可以分为Function Mode和Test Mode。对于大型的SoC芯片工作模式多种多样,特别是牵涉到不同子系统工作电压可变,甚至同一子系统不同功能模块的工作电压可变,排列组合出来的Function Modes数量可以达上百个,这部分与设计是强相关的。
    的头像 发表于 06-28 16:58 802次阅读

    Top和Block实战经验以及DDR接口时序

    IO约束在顶层和模块级的主要命令都是以下几个,但是实际应用的复杂程度不可同日而语,本篇会先介绍模块级IO约束实战经验,然后讲解顶层IO约束复杂性,过程中会介绍DDR接口时序。
    的头像 发表于 06-27 15:07 596次阅读
    Top和Block<b class='flag-5'>实战经验</b>以及DDR接口时序