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

STM32 TouchGFX经验分享(二)

[复制链接]
STMCU小助手 发布时间:2023-3-5 12:26
通过TouchGFX创建事件逻辑函数9 Q3 E& D% ?3 q) a
TouchGFX Designer中的交互由触发器和动作组成:' u3 b6 }" l9 e7 `- n) @6 W# F. G
触发器:是由用户点击或者进行其他操作后产生的信号。3 C* q0 u0 }9 ^* Y' v8 S/ g  h; m
动作:由触发器触发的相应的事件逻辑。1 \/ E& A  i5 X3 _# p
要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。6 V; o1 r) C! s
6 O3 L2 I  o; A0 ^9 N8 [
20200617134948186.png 1 ~$ w6 L( C- Z" a" e: t$ H

  ~) q) r0 O* a$ ~2 f& \# T! C  r添加后界面样子如下:' K5 e3 S, u7 F9 A5 U

4 c- i4 `: F) x3 L
20200617135151986.png
" `+ o: d& `+ ^
, w. l2 V) L: I
Trigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。
# b0 J' u+ ~+ i2 ^3 C  h4 v+ ]Action:action的操作分为了两种,第一种是作为基础窗口的动作:
( n8 {7 y& B# E2 }/ n; w' d该种动作包括:
+ A5 Q. [- I& O' H& w
% W  `$ {3 {1 ^! W
@0]H}(7%UT3U9A$ZUH3~I.png
, v$ h9 R' c  _4 w2 ?& D9 c7 a7 n1 h
( P" `2 E  [2 `9 J6 h
第二种是控件的属性提供的动作:( l! g4 ~7 A- ?8 E3 `' m
; g* A5 A1 t2 L% F$ ~2 E
N`CP]_(0Y_JS[UG_QGJC)VS.png
+ n- |3 z: n- P7 L( c: R+ S

' K( H' K7 g3 y在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。5 Q9 [, {/ e7 c
  J$ i/ J9 E7 n4 I
Base类中的秘密: N) B3 Y2 j0 y' c/ u; D
在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:& q* U1 {+ |5 k
我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图/ |! N- K1 Q2 d5 T( M1 @- f
" t' l& t) s( G0 r

# t& w) i! b+ Q  [% ^5 n 20200617141157230.png
5 T3 h- P4 u; M5 U# N6 E. w4 y! {! ~+ @" O% c
我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:) c+ w7 J9 ?$ V( _" P
# I1 z, K) @- C: j
2020061714214482.png
7 c& S" |/ X& n' D) q2 f" I, Y
7 Z$ L4 V9 O7 t* J8 L1 a
我们看下该类中的头文件:. H. f9 B; l: E% n/ Y
  1. /*********************************************************************************/
    9 v9 {, r7 h% ~  D1 M# [
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
    " h9 C9 {) ?' }( m9 [, M( M
  3. /*********************************************************************************// @- }) b0 Y0 _# i/ }
  4. #ifndef MAINWINDOWVIEWBASE_HPP6 X, |" j4 Z, P2 y
  5. #define MAINWINDOWVIEWBASE_HPP
    , V4 F: D4 A- g4 {. A# j

  6. 8 ?0 O& t: q# F: O5 u" W: @& s, J
  7. #include <gui/common/FrontendApplication.hpp>
    1 B! `% i: z" ]  q. D6 S/ T
  8. #include <mvp/View.hpp>
    - B+ g0 O1 B+ E) Y0 {
  9. #include <gui/mainwindow_screen/MainWindowPresenter.hpp>8 P( H3 \, ]8 \" T$ E
  10. #include <touchgfx/widgets/ScalableImage.hpp>
    / t4 k' \; e' P" j* b
  11. #include <touchgfx/widgets/ButtonWithLabel.hpp>
    0 q0 a& _% n$ H% v8 M+ W* m
  12. #include <touchgfx/widgets/TextAreaWithWildcard.hpp>
    . b4 i* \! R8 |/ f! _
  13. #include <touchgfx/widgets/Button.hpp>" o4 S9 |' D, u: Z, m# e) s

  14. 1 i1 V5 x% v' F9 n
  15. class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>* t' g1 _( s& |$ d/ a. X
  16. {4 L: e) D. g3 [% s& n% \* S7 F
  17. public:
    / `* g0 f! j5 y/ k
  18.     MainWindowViewBase();* ]( N( o8 n7 Z3 g% q9 W
  19.     virtual ~MainWindowViewBase() {}7 V4 L5 }" x& m6 e* _" |5 Z
  20.     virtual void setupScreen();  窗口创建时响应的函数- ]; T5 g% g. I6 i/ r

  21. ( z. w2 A: Z$ x7 t5 m7 A0 n- C  b
  22.     /*
    4 x: C5 |; d9 S1 s, H7 d% ~
  23.      * Virtual Action Handlers) z  P! D$ Y) C' B0 `) Q) R* ^( P
  24.      */
    ) u7 i3 K5 {/ H* }: p/ Z' ~" F
  25.     virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。
    $ l6 M% r7 i! p. G
  26.     {
    * K! S1 `: z$ ~2 U% L% I! M% z
  27.         // Override and implement this function in MainWindow
    & B$ {& s8 [: ^" j
  28.     }
    % T9 l/ B. D$ s6 o( d
  29. 7 z  \) G) M/ @! F* u4 S
  30. protected:$ j! j- _# H' [0 Z# H. W, W
  31.     FrontendApplication& application() {
    - V5 D+ G3 B/ z
  32.         return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());
    % F) Y1 E# A/ K$ a1 ]
  33.     }
    2 ^+ Y* t' J1 J

  34. ( u) C' X9 w5 }- d6 j/ z
  35.     /*: T  R" ?+ E% U) y( x/ a/ h
  36.      * Member Declarations
    ) N' e$ e2 }- Z* \4 S
  37.      */! u9 e. {/ ]! E0 m$ D
  38.      这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。' E7 N* ^4 z8 g
  39.     touchgfx::ScalableImage BackImage;  
    $ v1 |! c3 ]2 Q" p. p! V$ C
  40.     touchgfx::ButtonWithLabel ChangeImage;7 n" W& a0 i+ e3 k) g
  41.     touchgfx::TextAreaWithOneWildcard textimageid;
    4 n4 [6 C8 s2 {
  42.     touchgfx::Button NextView;
    ! ^9 R4 J* d- G5 g
  43.     touchgfx::Button ChartARTViewButton;
    ; h9 S& ]* Q( q- ?( S
  44. % c: G( [* h8 S# n, i
  45.     /** ~% q2 ]! {2 J1 @, b& ]2 w
  46.      * Wildcard Buffers
    2 m8 f; E6 l( k+ w: Q& p, p7 h" l
  47.      */4 L; H, f& |' h2 N% i( v9 J
  48.     static const uint16_t TEXTIMAGEID_SIZE = 3;$ D% H5 B. Y& ]2 b0 D
  49.     touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];; W7 H/ t# M0 Z: e3 z& \, n
  50. ( E9 A8 Q1 C& d& u1 N: h
  51. private:
    : I( q6 i/ b/ J# x. y
  52.         这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。
    1 L5 h7 V1 [- v% I8 I$ t9 C
  53.     /*( p! K. J* h* ~
  54.      * Callback Declarations
    ( y! F  Q8 ]5 `0 S- a* p
  55.      */9 a7 @5 V$ b0 e3 |
  56.     touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;" B) i& Y: r( d1 a' M1 C, t7 [

  57. ! w. T- S3 h9 L' X2 A. h
  58.     /*
    - c5 Z3 j2 O/ s) A# S
  59.      * Callback Handler Declarations
    7 B( q0 Y3 C/ W" n
  60.      */) B/ y; q* U0 Z; Z
  61.     void buttonCallbackHandler(const touchgfx::AbstractButton& src);
    ' |5 R" m8 _- i6 \
  62. * `9 }$ r& N) h
  63. };
    # x0 X1 B/ }, E/ K) d
  64. 2 Y+ f' A/ r- p1 V# n/ ?: K  }" w
  65. #endif // MAINWINDOWVIEWBASE_HPP
    : R  t# W4 Q0 m! E  |  p& v! q
  66.   D/ n+ ]  f  {: E
复制代码

6 R9 `, ~3 h, x9 H5 W到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
) P+ z: ]* u/ V/ b, o
  1. /*********************************************************************************/
    8 l/ d' d; ~; |; f
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
    ) d/ \9 i/ W0 ~: |$ ?6 o. q: B
  3. /*********************************************************************************/
      l2 H  D# b9 N; w
  4. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>9 |& h4 f8 I" A4 P
  5. #include "BitmapDatabase.hpp"/ A, @7 c0 m( G; A# W- O
  6. #include <texts/TextKeysAndLanguages.hpp>& p  H( ]  ]$ p' d
  7. #include <touchgfx/Color.hpp>4 }6 V: G% R# X, s6 [5 Q% _5 {1 l
  8. 6 |% z& \- a4 Y7 v
  9. MainWindowViewBase::MainWindowViewBase() :3 E+ A$ {  O; {* m
  10.     buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)! T' j7 R7 z% L( e, M- z" \
  11. {
    6 N+ q. }- t: f6 @2 k( s
  12.         在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置6 U3 c+ H! _8 W3 F% |% z7 B- y' `
  13.     BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));0 s+ C! M  v+ j' ~5 @7 p
  14.     BackImage.setPosition(0, 0, 800, 480);1 `  @6 I, _6 P# D
  15.     BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);5 g4 D' F/ m/ ~- R7 q" I

  16. . F8 N3 s+ [% ^9 l
  17.     ChangeImage.setXY(315, 0);
    ' }2 ?  P, g# h* J+ Z
  18.     ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));! @. Q/ h% t4 B. C- w8 `- ~
  19.     ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));# L( I" O* m9 u# Q. \3 d9 c- ?
  20.     ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    ! T) D7 k* y; k+ k2 B
  21.     ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    ! l8 I7 ]( ^* @' o2 E3 g/ p
  22.     ChangeImage.setAction(buttonCallback);这里可以看见添加action方法3 p: |' D6 t, g9 ~! q; M, W" j

  23. + b$ e2 @' k! S+ U" z4 W
  24.     textimageid.setPosition(394, 68, 26, 25);
    : X3 c0 u" f1 w! O+ [5 Q! x
  25.     textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));  t' i1 {0 Y8 |1 [8 M( q
  26.     textimageid.setLinespacing(0);) |0 \! A$ f5 j
  27.     Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());
    " G" F5 {2 |" `& h4 o
  28.     textimageid.setWildcard(textimageidBuffer);
    + B+ ~7 o* g- m7 f; ?
  29.     textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));2 u5 z4 X' R; [* ~6 g2 ~
  30. $ r( s! m2 \; t0 k& F, C
  31.     NextView.setXY(377, 135);% [5 [* y3 \4 S
  32.     NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
    % @' \2 A& V/ ]: Y8 G% R6 g) B
  33.     NextView.setAction(buttonCallback);5 Q' `4 p6 K+ c" D7 Q: B0 i% i$ n

  34. 9 z( G. P  N, e& c" N5 g$ K6 d
  35.     ChartARTViewButton.setXY(377, 230);
    ( a% o8 {0 r5 u2 [* u
  36.     ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
    * B. W7 M7 u  k7 B
  37.     ChartARTViewButton.setAction(buttonCallback);页面切换的action函数
    0 U' X% W: Z! C6 l5 }
  38. 在窗口上添加控件方法" C' X/ t& r6 Z# q; `* R% y
  39.     add(BackImage);5 i$ R! i2 a3 c+ V7 {! s
  40.     add(ChangeImage);
    % D# s; Z) ]0 H; S
  41.     add(textimageid);2 ?/ c, I7 a  p& g6 U6 |
  42.     add(NextView);
    2 c  F" z! ?# q; R# B
  43.     add(ChartARTViewButton);
    9 L" G( _( J; W# N/ b
  44. }7 J! B& }5 v7 ^/ x
  45. 9 t# Z% L4 ]3 [5 V* N3 P
  46. void MainWindowViewBase::setupScreen()! E  x  ]2 @+ ]- U4 G# L& g) M6 e  N
  47. {
    4 e: e! t0 R% q
  48. 2 D$ S3 u, @9 @1 H. O0 _$ J, }
  49. }; n' g+ g" H+ @! ?* C- e/ ]  M
  50. # J4 s& O7 ?* @2 u* M- J, E; K
  51. void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
    ) ?% F1 ^( K0 E' _$ M( q
  52. {
    ( d, U! B* d( a/ S
  53.     if (&src == &ChangeImage)
    1 g! W5 f- n& ?4 `/ `
  54.     {; p5 g  [" v- p& O
  55.         //Interaction1
    % [- p3 x! U& t8 Q) \9 k
  56.         //When ChangeImage clicked call virtual function; Z) B, T5 Y3 j
  57.         //Call setBackImageIMG2 q0 ~2 v7 E8 M  f, }3 f( Q
  58.         setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。3 c& u' f3 `3 o# R- {
  59.     }& a7 A& \- X+ W! c( u! \$ u
  60.     else if (&src == &NextView)1 ?+ w$ t; k1 N
  61.     {. a( b4 N8 x9 M: ^1 P$ W/ _0 G6 t
  62.         //Interaction2: t4 [5 V- r7 x0 y4 D! ^  _5 b: Z$ i
  63.         //When NextView clicked change screen to TabView
    # H9 R2 Q- \: E8 a+ r
  64.         //Go to TabView with screen transition towards East
    2 s6 n4 B5 {" \: {) W% F" t' O9 t
  65.         application().gotoTabViewScreenSlideTransitionEast();0 B- o( l% `# `7 H
  66.     }7 r8 k9 ?  z  p( m* m
  67.     else if (&src == &ChartARTViewButton)
    * {% K* k3 Q0 F: V
  68.     {
    6 F* K- a% q- a# h. z, n
  69.         //Interaction3
    8 s! n% l! F0 E4 l
  70.         //When ChartARTViewButton clicked change screen to ChartView
    1 e( ]  @  c& ]1 G) u  v) A4 i
  71.         //Go to ChartView with screen transition towards East
    - l3 \) d: C6 g+ V2 o
  72.         application().gotoChartViewScreenSlideTransitionEast();
    . m# ]0 C$ V- ]4 I% n' l
  73.     }5 R! K$ S& M- X) c
  74. }3 {* G# |" M+ s. \, m* F0 [
  75. / }7 D6 f  v4 h% I
复制代码
, u, @1 g; w8 b: o9 d
由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。2 a7 X& h, j4 \; Z0 q$ b

3 ?& m& g2 M8 K
* G$ O8 z, x' c* t$ _+ k
View类的作用
* p$ i+ {4 @( g- T* c3 pview中的内容是可以进行修改的,可以根据需要添加自己的使用方法。
' J, {9 a/ u& u9 N下面我们再看一下MainWindowView.hpp文件。
7 P4 V2 e- S# {9 l
  1. #ifndef MAINWINDOWVIEW_HPP
    . p+ z9 S) _9 Q5 l
  2. #define MAINWINDOWVIEW_HPP
    * b! s+ |8 K) [8 e4 w

  3. ( [$ r; ?: E; D% s
  4. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
    . l9 O4 M! _( G$ g  Q
  5. #include <gui/mainwindow_screen/MainWindowPresenter.hpp>0 C( G) f9 m, d; C9 _
  6. # b6 f* _6 F# I8 O  a5 m

  7. 4 }# r4 L; V" L7 u
  8. class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase
    - x0 |2 \, ]; n3 U0 A
  9. {
    ( {# [5 J1 H; _* w7 g4 M  O
  10. public:  \2 n4 u' T9 ~: E# @' k% r, V/ f
  11.     MainWindowView();+ M/ s0 b6 S$ r& \0 {1 N1 K: p
  12.     virtual ~MainWindowView() {}3 ^  y. G3 F! c: o1 k
  13.     virtual void setupScreen(); 正常创建时,到此处就没有了。0 e) ^* L- a  K7 a! Z
  14.     下方的文件是手动添加的,如果在界面上创建了function函数,9 @, w/ j5 h% k. P5 b* \- g% d! M
  15.     则在该文件中添加一样的虚函数,具体在上方的base中能看出来。4 E$ \3 N. n/ b
  16.     virtual void tearDownScreen();
    + z! Z4 W" I7 u# C" `0 }3 W0 a& x8 `; l
  17.     virtual void setBackImageIMG();
    & L! x9 ?; V1 F/ O& E. |# \: R
  18. protected:
    # B5 w- A3 i1 a" [, x% ~  R
  19. 7 L2 c; x/ d7 w( R( `
  20. };6 N+ D5 x6 o- ~" M4 n4 V) H- V
  21. 5 ^# S$ W& W6 C+ c
  22. #endif // MAINWINDOWVIEW_HPP
    ! J5 [$ N7 b  @7 C4 h/ U4 {
复制代码

( A' W0 J, z% T/ h3 m& O( @. M, {8 i此时就可以在cpp文件中添加相应的函数实现了。$ _8 [/ I8 _# e% f% L
% P% c9 I0 r5 m4 |
按键事件响应逻辑: ~$ B  t3 {  B
好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。% W) j( Z0 E% E+ K" d# u, \  p& ^- u
除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。% K# f6 u; H( d6 P5 |9 z% \. s
————————————————
' J9 m( i. ^9 b- r& I$ Z版权声明:空闲的程序员
8 N1 D3 D# B% V( g7 z% g2 ^4 g2 G: W' S

0 ?( F/ y) `: f3 a  Z+ C' v
收藏 评论0 发布时间:2023-3-5 12:26

举报

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