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

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

[复制链接]
STMCU小助手 发布时间:2023-11-19 12:42
01引言% A9 M3 z% B# n+ |( C/ x
TouchGFX 是专用于 STM32 的图形界面设计软件,可用来低成本开发优秀的图形界面,TouchGFX 现已变的越来越流行。为了帮助客户更加深入地理解和使用 TouchGFX ,本文介绍了 TouchGFX Designer 中的 Mixin 功能,从基础示例 Button Example 出发,为文本框控件添加 ClickListener (Mixin 功能中的一项),并对源代码进行简单剖析。期望能帮助客户更深入地理解 STM32 TouchGFX 的相关功能。" J- }: C# N* C4 `* V% z
2 M- p. K( L( S  L& Z; r5 _; d! g
# G4 m4 G5 r' u7 E  V1 Z, t6 S* B4 A5 _
02TouchGFX ClickListener 模板的使用+ e4 p, T) b# V& K/ B/ X
2.1. C++模板编程基础. C9 S9 Y0 e- ^6 a0 m4 ^
在示例介绍之前,让我们先熟悉一下 C++模板编程的一些基础知识。模板编程属于通用编程的范畴,是为“尚未确定类型”所写的函数或类。是可以产生更干净、更快速、更精明的软件的一个强力手段。
/ {0 A' o! P/ I8 y, i# S# X
8 y5 ~9 [0 W+ ]
模板的优点:首先模板与某种特定类型无关,代码可重用性好;其次模板与平台无关,代码移植性好;另外模板代码在编译时才进行解释,在编译时确定检查数据类型,相比运行时检查,类型的安全性高。
0 f8 `# \' X% r' ], i- ?/ |! K" _& u2 g& v- A- G
模板的缺点:一是代码易读性不是很好,调试不便;二是用户工程代码中需要包含模板代码(非二进制库),编译的时间较长,二进制扩展性差;另外有可能会造成二进制代码膨胀(编译后二进制代码臃肿),我们在设计模板时,需要尽可能将 C++模板中与参数⽆关的代码分离出来。
* H/ ^0 n: Q+ c8 p# A
+ ]+ o8 b; e9 m& C! M9 s- ~1 q

8 d; Z* L' S) A( n9 n2.2. TouchGFX Mixin 功能简介
. i0 f* ]' h4 j- [模板一般分为函数模板和类模板。函数模板我们这里不做赘述,重点关注 TouchGFX Mixins 类模板。TouchGFX 的 Mixins 类模板用于拓展控件的功能,目前 TouchGFX v4.20.0 中有四个 Mixin 功能,分别是 Draggable、ClickListener、FadeAnimator 和MoveAnimator,分别为控件增添相关功能。如图 1 (TouchGFX Designer Mixins 功能)所示,本文主要针对 ClickListener 做具体介绍。, O. N& ?% `" d& [/ R+ F/ ~! k  D

+ G/ D, Z, m0 @7 X6 \9 a2 e; j
微信图片_20231119124128.jpg

( z% c: R3 u' A. `9 t- H. n
图1. TouchGFX Designer Mixins 功能

9 B+ t3 i  Q# g6 L, X

  B) y" d& k% ^7 {2.3. 基于 TouchGFX Button 例程使用 ClickListener 功能
9 g/ `* y6 V- e% Z4 q
2.3.1. TouchGFX 例程的代码生成5 h/ u) i. O. D
运行 TouchGFX Designer,选择 Examples;通过 Select Board Setup 选择STM32H735G DK 板;从众多例程中选择“Button Example”例程;将 Application name 改为 Button_Example,如下图图 2,然后点击 Create 创建工程。
: ?- G4 N6 {: r/ }4 D4 i& U8 R9 U& f) j
微信图片_20231119124125.jpg
6 y7 o1 L1 A) x3 t6 e9 m
图2.TouchGFX Designer 生成 Button Example 例程

5 _& Z0 P& Y% ^/ T8 r6 |

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

. N3 E' S  X- x2.3.2. 为计数文本框控件添加 ClickListener 功能# t  `  V; G9 L6 ]7 v  `
我们在 TouchGFX Designer 主屏界面,点击 countTxt 文本框,然后在右侧属性栏中找到 Mixins,勾选 ClickListener,如图 3 所示。然后重新生成代码。: k# n* i8 I8 |/ Y+ G& B8 k1 n

1 ]2 w" J* m7 S' n) n6 v  b0 n
微信图片_20231119124122.jpg

8 H3 f$ m7 I1 v
图3.TouchGFX Designer, 计数文本框 mixin ClickListener 功能

- ^* H, C, s# Z; ~: Z. |
; p3 k1 e6 ]% q* C$ u
我们可以使用 VS code 编辑代码,或使用其它如 STM32CubeIDE 等工具编辑代码。打开 MainView.hpp,为计数文本框,添加代码如下(黄底色部分):
$ [6 w" [/ j! b) X, P
2 f2 b) s( B8 w$ Q. G7 H
微信图片_20231119124119.jpg
! r0 _# D4 k; P0 |* b) l  i! S
微信图片_20231119124116.jpg

0 f& Y$ t& t2 J  D$ K/ Z! }8 e8 e: z
然后我们转到 MainView.cpp 文件,首先将 txtClickedCallback 对象与 MainView的 cntTextClickHandler(文本框点击处理函数)绑定,这是在 MainView 类的构造函数中初始化列表中实现的。将 txtClickedCallback 加入初始化列表中,参数使用指向MainView 中 cntTextClickHandler 函数的函数指针。我们还需要修改 setupScreen 函数,在这里为 countTxt 添加 ClickAction,参数使用 txtClickedCallback, 以实现在主屏界面创建时,将 countTxt 文本框的点击事件与 txtClickedCallback 对象绑定在一起。另外我们还需要实现 cntTextClickHandler,具体代码如下:
$ D+ f! [1 R' O2 t5 m
4 N; P# v; n7 u! G
微信图片_20231119124113.jpg

) r% f3 \7 I- r  a

) V; K4 ]' n5 i5 K修改完成后,保存,编译,运行。您将会发现当每次点击 countTxt 文本框时,文本框计数会增加 2。至此,我们已经实现了为文本框控件加入 ClickListener 的功能。大家可以看到,在 TouchGFX 应用中使用 ClickListener 类模板做开发是十分便捷的,代码量也较小。下面我们对代码进一步解读。
# ?0 Y6 R( |9 p6 v
7 h; `3 g1 O" C8 s6 n5 u  U+ l
2.3.3. ClickListener 模板代码# w" `( X* w4 @: v3 ^: y; X2 @, l
ClickListener 类模板是 TouchGFX 框架的一部分,封装在 ClickListener.hpp 中,代码如下:
7 D% }7 m& Z) A' I  K, V/ _( V- D& v! g
微信图片_20231119124109.jpg

- F; v# Y( h# Z) j( H- e0 s
微信图片_20231119124106.jpg

6 N' }/ z8 }, e

% W% y- J9 K* Z. _( U/ L9 qClickListener 是一个标准的类模板。所谓类模板,就是“包含一个或多个尚未确定类型”的类。必须将具体类型当作模板参数传入,才可使用。当传入模板参数后,该类模板便以你所指定的参数类型,由编译器进行实例化。将具体类型传入到类模板进行实例化,我们会得到一个新的 ClickListener 类,转变为从传入参数(某待定的类)的派生类。 + u) O6 J  R, L% l, t) }- r) |

6 ]" P$ I' u) g& k! i4 c5 U' }3 ` 在生成的代码 MainViewBase.hpp 中(MainView 是 MainViewBase 的派生类),我们可以找到 countTxt 的声明:8 N6 o- J+ X  C' A7 d* S1 i

/ y8 `* \  ]" atouchgfx::ClickListener< touchgfx::TextAreaWithOneWildcard > countTxt;
  f! j; a7 U2 `+ d- [% i

, U5 s  @, t7 p- a这里,该模板示例类是从 TextAreaWithOneWildcard 类(即原计数文本框类型)继承下来的。如果您选择的不是为文本框增加 ClickListener 功能,而是其它控件,则新的ClickListener 实例类将派生自您所用的控件。本例中的继承关系如下:
7 M5 r* v+ {: E6 T! _7 ^8 r* c2 x
微信图片_20231119124102.jpg

! r0 F2 O4 w% ?, f  E

1 \, V& V7 l( U+ T& j% ^$ g该 ClickListener 实例类是 TextAreaWithOneWildcard 类的派生类,不仅仅继承了TextAreaWithOneWildcard 的属性与方法,另外还添加了一个 GenericCallback 指针变量clickAction,该指针由附加的 setClickAction 方法赋值。由另一个方法 handleClickEvent使用,在 handleClickEvent 中在响应 Click 事件时,会调用该 clickAction。(关于callback 类的使用,我们这里不做赘述,如果您需要进一步了解,请参考 TouchGFX 相关文档)。
8 Z0 q7 W5 V# L) Q# I, D
/ b- O# p) P8 j# ?, v
2.3.4. ClickListener 模板应用, A1 s4 ~% ~/ R& ?6 y
我们清楚了 ClickListener 类模板的原理后,回头来看例子中的 ClickListener 的应用代码,就会发现其逻辑十分清晰。
8 L9 y3 S8 s- A- B7 N
* S7 m4 F" v1 I
首先在 MainView.hpp 中声明了一个 Callback txtClickedCallback, 和一个事件处理函数 cntTextClickHandler。在 MainView.cpp 中初始化该 txtClickedCallback, 将其与cntTextClickHandler 关联,即实现当调用该 Callback 时,会转到 cntTextClickHandler 进行处理。9 h# n2 X. e) _
- P/ t3 H1 B3 ^3 |1 Y, J9 n8 x$ ^
再在 setupScreen 函数中调用 ClickListener 类模板接口 setClickAction 将txtClickedCallback 的地址赋给 ClickListener 实例化类的 clickAction 指针。则ClickListener 实例化类(这里即 TextAreaWithOneWildcard 类的派生类)在处理ClickEvent 时就会执行到 txtClickedCallback 关联的处理函数 cntTextClickHandler. W7 R! h7 i9 L, L5 ]  C) _
& ?7 |0 M# Y; a* M4 s
最后需要实现 MainView 类中的 Click 事件处理函数 cntTextClickHandler,这里的实现为:当 Click 事件类型为“Click 按键释放”时调用 increaseValue 函数两次。! D6 Z! y2 o& d, {( O

3 I- y( B+ Q: H) a03小结
1 z, l# U1 L% L8 n6 t8 o- I% ~. p4 ATouchGFX 是 STM32 专用的界面设计工具,功能强大且易用。本文选择了 Mixins 功能进行简介,从基础示例 Button Example 出发,动手添加 ClickListener (Mixin) 功能,并从源代码的角度浅析了 ClickListener 类模板的使用,助力客户更深入地理解 STM32 TouchGFX。
$ L1 Q2 T  f; q1 H2 r$ E
/ D9 B# H/ h0 d7 D9 i% V+ H" [转载自: STM32单片机; @2 ~, U) o7 K7 \0 F% w
如有侵权请联系删除
& h% L, r) \+ s; b, ]7 o( R
. T; W% Q& J6 l' k1 I- y' L
收藏 评论0 发布时间:2023-11-19 12:42

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版