你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的TouchGFX 控件附加 ClickListener 功能的方法介绍

[复制链接]
STMCU小助手 发布时间:2023-11-19 12:42
01引言
8 i3 C2 J: a# Q5 XTouchGFX 是专用于 STM32 的图形界面设计软件,可用来低成本开发优秀的图形界面,TouchGFX 现已变的越来越流行。为了帮助客户更加深入地理解和使用 TouchGFX ,本文介绍了 TouchGFX Designer 中的 Mixin 功能,从基础示例 Button Example 出发,为文本框控件添加 ClickListener (Mixin 功能中的一项),并对源代码进行简单剖析。期望能帮助客户更深入地理解 STM32 TouchGFX 的相关功能。( c2 r+ d" |# ^7 x) ]/ [, L+ q
7 Z0 u3 k' I. g: Z& |  O6 n

" T! O) l" \* S7 c# i! g02TouchGFX ClickListener 模板的使用
  z. Y7 K5 U7 q5 D2.1. C++模板编程基础
# r, |5 X; ~$ Z4 F# I9 F在示例介绍之前,让我们先熟悉一下 C++模板编程的一些基础知识。模板编程属于通用编程的范畴,是为“尚未确定类型”所写的函数或类。是可以产生更干净、更快速、更精明的软件的一个强力手段。( D( O% n3 k5 Y+ d- v7 k

* B. E0 G7 f" F8 y- I4 S+ {模板的优点:首先模板与某种特定类型无关,代码可重用性好;其次模板与平台无关,代码移植性好;另外模板代码在编译时才进行解释,在编译时确定检查数据类型,相比运行时检查,类型的安全性高。
& M# h; d! \. {" u6 w
& n1 ?, o, W7 y" t2 ]! O模板的缺点:一是代码易读性不是很好,调试不便;二是用户工程代码中需要包含模板代码(非二进制库),编译的时间较长,二进制扩展性差;另外有可能会造成二进制代码膨胀(编译后二进制代码臃肿),我们在设计模板时,需要尽可能将 C++模板中与参数⽆关的代码分离出来。) g  v$ }9 O4 L4 l8 @9 W

- S3 M5 p: D8 Q2 `  t9 G+ [! i& d
. X5 f. p: y; y4 J5 l
2.2. TouchGFX Mixin 功能简介
& {! [3 T8 j" G  k- S模板一般分为函数模板和类模板。函数模板我们这里不做赘述,重点关注 TouchGFX Mixins 类模板。TouchGFX 的 Mixins 类模板用于拓展控件的功能,目前 TouchGFX v4.20.0 中有四个 Mixin 功能,分别是 Draggable、ClickListener、FadeAnimator 和MoveAnimator,分别为控件增添相关功能。如图 1 (TouchGFX Designer Mixins 功能)所示,本文主要针对 ClickListener 做具体介绍。9 n. C0 b" X+ e5 P7 d0 H
0 r2 |% V, }3 G3 r
微信图片_20231119124128.jpg

2 U; K4 \' u+ R) X' c
图1. TouchGFX Designer Mixins 功能

+ _6 W% l& Z2 p: S  f
4 P9 i4 c: `) g) k  M6 r0 W
2.3. 基于 TouchGFX Button 例程使用 ClickListener 功能
& {. @" ]( y" G$ y# i* ]
2.3.1. TouchGFX 例程的代码生成
0 M+ b9 H& b; A7 Q, |. u运行 TouchGFX Designer,选择 Examples;通过 Select Board Setup 选择STM32H735G DK 板;从众多例程中选择“Button Example”例程;将 Application name 改为 Button_Example,如下图图 2,然后点击 Create 创建工程。; t  I8 [8 R, N9 ?

) B5 u! R2 ~' A; f7 O6 i
微信图片_20231119124125.jpg

+ ?+ c( q1 j. I( v# l5 m8 i6 }" L
图2.TouchGFX Designer 生成 Button Example 例程
! o- s3 I, _9 L& f
/ q$ @1 m+ U0 }: ^
进入 TouchGFX Designer 主界面后,会看到画布上有两个按钮和一个文本框,我们对界面不做更改,直接选择 Designer 右下角 (Run Target)生成代码。该操作将会复制TouchGFX 框架文件,生成配置文件、makefile、代码及资源文件(images、fonts、texts),然后编译链接、烧录目标板并运行。程序运行起来后,您可以熟悉一下该按钮例程应用。下面我们就针对该例程,为界面上的计数文本框控件注入 ClickListener 功能,应用实现“当点击计数文本框时,计数数字增加 2”的功能。
+ }) H& s7 |, A4 W, r; s5 ]: @2 C9 Y2 `: G9 b

7 s# x) b, W" q& J' ^0 C2.3.2. 为计数文本框控件添加 ClickListener 功能' y' m/ [# z$ w: E- C; |/ @+ e: M
我们在 TouchGFX Designer 主屏界面,点击 countTxt 文本框,然后在右侧属性栏中找到 Mixins,勾选 ClickListener,如图 3 所示。然后重新生成代码。
) U' U0 a/ I3 t; S# j0 D' L% E# L" x( M7 D2 U1 N, K) d1 Q" v
微信图片_20231119124122.jpg

5 f; K+ `8 n1 z& b; p7 P
图3.TouchGFX Designer, 计数文本框 mixin ClickListener 功能

' c- l  Y4 Q$ k0 R4 H, R
$ Z0 D& h3 w7 V, ~- l
我们可以使用 VS code 编辑代码,或使用其它如 STM32CubeIDE 等工具编辑代码。打开 MainView.hpp,为计数文本框,添加代码如下(黄底色部分):; {( ~  H! p& i2 h* N9 k

- O$ {8 P( e/ f# R7 ^
微信图片_20231119124119.jpg

2 \& I# B3 s. Z) B' N8 q! {2 c
微信图片_20231119124116.jpg
7 a8 M: d5 E9 A$ J' R: o

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

; {, H7 h6 p: d
微信图片_20231119124113.jpg
5 F2 D6 x: m/ h5 C, S+ P) x
: U7 _. ~4 w- i; `
修改完成后,保存,编译,运行。您将会发现当每次点击 countTxt 文本框时,文本框计数会增加 2。至此,我们已经实现了为文本框控件加入 ClickListener 的功能。大家可以看到,在 TouchGFX 应用中使用 ClickListener 类模板做开发是十分便捷的,代码量也较小。下面我们对代码进一步解读。+ G& }1 `1 C" y4 \

5 O/ T, T, s3 Z5 K4 ~2.3.3. ClickListener 模板代码# u4 I4 f" n, d1 d) u$ Y# D+ h; A' R
ClickListener 类模板是 TouchGFX 框架的一部分,封装在 ClickListener.hpp 中,代码如下:
% ^. R- |5 a4 K$ p
; p, i; r+ G! b' j1 h' H. Q+ o  u0 W/ N
微信图片_20231119124109.jpg

0 o0 M4 [- D4 ^6 E
微信图片_20231119124106.jpg
1 h) q  V+ t2 z$ |  z' ]. L; ^
6 X5 c# |2 `  p' l2 e: o
ClickListener 是一个标准的类模板。所谓类模板,就是“包含一个或多个尚未确定类型”的类。必须将具体类型当作模板参数传入,才可使用。当传入模板参数后,该类模板便以你所指定的参数类型,由编译器进行实例化。将具体类型传入到类模板进行实例化,我们会得到一个新的 ClickListener 类,转变为从传入参数(某待定的类)的派生类。
' K1 f6 s: C* ^8 i* N! z: s; {
! R6 L# [8 Y$ S8 N 在生成的代码 MainViewBase.hpp 中(MainView 是 MainViewBase 的派生类),我们可以找到 countTxt 的声明:
( X) d# L/ _* m& d

- X0 Z0 }% Y- l  D$ \touchgfx::ClickListener< touchgfx::TextAreaWithOneWildcard > countTxt;: N4 s3 X' n+ |7 G7 O
5 ~& n9 k, T2 L1 x
这里,该模板示例类是从 TextAreaWithOneWildcard 类(即原计数文本框类型)继承下来的。如果您选择的不是为文本框增加 ClickListener 功能,而是其它控件,则新的ClickListener 实例类将派生自您所用的控件。本例中的继承关系如下:
$ m1 d% Q) E9 x: N/ q0 B0 M8 z
微信图片_20231119124102.jpg
* `& ?% X) L. L7 f$ O) j4 s
- n! I' Y' n) s" }. o( }: @& q
该 ClickListener 实例类是 TextAreaWithOneWildcard 类的派生类,不仅仅继承了TextAreaWithOneWildcard 的属性与方法,另外还添加了一个 GenericCallback 指针变量clickAction,该指针由附加的 setClickAction 方法赋值。由另一个方法 handleClickEvent使用,在 handleClickEvent 中在响应 Click 事件时,会调用该 clickAction。(关于callback 类的使用,我们这里不做赘述,如果您需要进一步了解,请参考 TouchGFX 相关文档)。0 x6 x# T* u9 M; K) M
9 O+ l5 f& f$ r) T4 n8 |
2.3.4. ClickListener 模板应用
$ \+ ?* P, `( ~* e; k" u2 I我们清楚了 ClickListener 类模板的原理后,回头来看例子中的 ClickListener 的应用代码,就会发现其逻辑十分清晰。. T1 h' h4 A3 o, s

' ~6 o" P8 _9 V1 B& g首先在 MainView.hpp 中声明了一个 Callback txtClickedCallback, 和一个事件处理函数 cntTextClickHandler。在 MainView.cpp 中初始化该 txtClickedCallback, 将其与cntTextClickHandler 关联,即实现当调用该 Callback 时,会转到 cntTextClickHandler 进行处理。
" x. h4 `$ M) q8 p  p

% j4 {2 R  }' d6 d7 n! f再在 setupScreen 函数中调用 ClickListener 类模板接口 setClickAction 将txtClickedCallback 的地址赋给 ClickListener 实例化类的 clickAction 指针。则ClickListener 实例化类(这里即 TextAreaWithOneWildcard 类的派生类)在处理ClickEvent 时就会执行到 txtClickedCallback 关联的处理函数 cntTextClickHandler4 ^: `7 _, {) x5 T3 J+ F5 g$ q
. ]& C+ K% i9 c1 V
最后需要实现 MainView 类中的 Click 事件处理函数 cntTextClickHandler,这里的实现为:当 Click 事件类型为“Click 按键释放”时调用 increaseValue 函数两次。
: f# \, D+ Z1 w* Q3 h

6 g8 [3 M7 V2 m  `4 T' `9 r$ ~# D03小结6 N8 l/ t, r* p7 e- H  E* o$ `* t
TouchGFX 是 STM32 专用的界面设计工具,功能强大且易用。本文选择了 Mixins 功能进行简介,从基础示例 Button Example 出发,动手添加 ClickListener (Mixin) 功能,并从源代码的角度浅析了 ClickListener 类模板的使用,助力客户更深入地理解 STM32 TouchGFX。3 f2 i+ j3 G$ j; X
9 G6 y# J6 t6 {# f/ Z0 v9 o/ ^  ^4 q2 d: y
转载自: STM32单片机
1 [; x7 N. U, c( U( J" H如有侵权请联系删除, P( [1 y  @% p" R  I. I9 ]& ^2 `
% ?$ n, p; z3 L# J3 s% n$ E
赞 收藏 评论0 发布时间:2023-11-19 12:42

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版