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

STM32 TouchGFX经验分享(二)

[复制链接]
STMCU小助手 发布时间:2023-3-5 12:26
通过TouchGFX创建事件逻辑函数
5 B# I, `( ~: ?6 @TouchGFX Designer中的交互由触发器和动作组成:8 |% K5 u: \* m3 H6 w
触发器:是由用户点击或者进行其他操作后产生的信号。# q2 E) C! F8 f% Q, F- Z  Q
动作:由触发器触发的相应的事件逻辑。
) i: K; g( H1 D1 V1 S要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。9 ]2 Q* j- F! S7 J* p  G8 S

9 D) m- \; m2 Y: y% w
20200617134948186.png ( W0 t/ t4 e3 x4 v: V" v1 D1 Z
+ `& o/ d" W9 _' V3 j
添加后界面样子如下:1 D5 O- V0 K# r/ U. a
" L0 d7 q2 X( N# V$ Z. K- g
20200617135151986.png
" U2 k7 W  G9 m) ^' N' D0 o% h' u
$ \6 c& E1 a, E; @9 p5 U7 g
Trigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。& B. N- K" `) [6 Z* B4 P3 k% ?: M
Action:action的操作分为了两种,第一种是作为基础窗口的动作:
' _3 R) v8 H8 w/ H( \7 H" ^4 j, ^3 f该种动作包括:
$ |# M1 p0 z1 Y8 L/ G; Q
( F+ v. B2 s' a; N5 r% a
@0]H}(7%UT3U9A$ZUH3~I.png # \" @- |2 J. n7 `# g
$ g3 l  W5 r/ n5 Y/ u9 F
第二种是控件的属性提供的动作:5 e" l8 Y; A( k$ W0 G* j

  j# f: y/ m: s4 h4 h
N`CP]_(0Y_JS[UG_QGJC)VS.png
: Z8 q9 {3 {3 D' ^. `4 ^! F
( o6 u: ?3 A) a
在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。9 ?' E% D( ?5 V! S/ n& b

  s; U7 J) R& |+ bBase类中的秘密7 C% A: d# u) O; d, n: X
在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:2 |* F6 T* q* \* d# R: C# d
我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图  ~& O" Y2 q7 R

7 s! B: j3 _# @  n
. Q  q  ~+ `. j" W) \
20200617141157230.png
8 b! Y9 T& h) T1 F  N0 V
: o3 ^9 _% e5 P/ @2 f7 {/ V3 @; |
我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:
3 }) i/ S- p3 ]6 C
, F& i& @5 x9 o, q: V; o% S% A1 N
2020061714214482.png 6 h: j, b& i% e9 l% @* a. O+ V

( h) ^/ ~- v: @2 ~0 z( N/ K  T5 i9 u我们看下该类中的头文件:: h$ R" ?2 k. D! u, q4 `6 j# [
  1. /*********************************************************************************/
    % Q! q6 U' q; f; g
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/: K# `. `* s; q0 m2 |
  3. /*********************************************************************************/: |& i: B: [7 s/ T
  4. #ifndef MAINWINDOWVIEWBASE_HPP
    2 R3 ?  a- M/ B- p3 g( Z; Q
  5. #define MAINWINDOWVIEWBASE_HPP
      m/ L% P# {1 W: z
  6. + G+ ^  c) P/ L" w) ?/ i6 J
  7. #include <gui/common/FrontendApplication.hpp>
    1 w& k+ n8 g! V( f9 K
  8. #include <mvp/View.hpp>1 z% H; U9 S( k- G, H5 y
  9. #include <gui/mainwindow_screen/MainWindowPresenter.hpp>( K% i5 H# S3 [  U) N
  10. #include <touchgfx/widgets/ScalableImage.hpp>
    9 T8 C* E7 M- [  t
  11. #include <touchgfx/widgets/ButtonWithLabel.hpp>7 V( J$ m2 Q+ G0 @) f1 w, C
  12. #include <touchgfx/widgets/TextAreaWithWildcard.hpp>+ p* b: Z- u) t+ ^) r
  13. #include <touchgfx/widgets/Button.hpp>& P( Y% ^8 u& ~" m+ c

  14. ' _$ |% Z- |: v! Y. Z# n+ ~9 ?
  15. class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>
      M+ [! J- M  R2 z; _  \
  16. {( y4 \6 I  |9 D% P; |
  17. public:" I/ q6 F  ]) x0 D% W9 L
  18.     MainWindowViewBase();: i! e% H1 i. {7 K! B6 H' J( S
  19.     virtual ~MainWindowViewBase() {}/ l7 }, _1 P" p5 X6 B9 V; \: T
  20.     virtual void setupScreen();  窗口创建时响应的函数
    6 ]5 v- b! p1 K
  21. 8 [# |3 b4 w4 e8 g5 ^, H
  22.     /*
    ; F% n) Y5 E4 m9 i9 C& p" v) M, ?
  23.      * Virtual Action Handlers; g' [; l+ L, E& ]7 y
  24.      */
      R4 {/ f  B7 \/ D
  25.     virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。
    8 }- m5 s( C6 g2 Z9 g5 {
  26.     {& w% L* @7 g6 ^2 _( C
  27.         // Override and implement this function in MainWindow
    3 r; n1 ?8 h0 E! y" f
  28.     }) c0 Y6 b" _2 P* _% ~( {
  29. / \3 G! i2 ~8 k6 [
  30. protected:1 @0 _) N9 ]( t, p- S8 t; H, S
  31.     FrontendApplication& application() {
    / P$ l& |: K% C8 j$ v
  32.         return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());: x/ W: ?% k5 d; p
  33.     }1 w0 h: A0 i% o& [4 J% m- M

  34. ) H$ i. I% M/ j  J# F. I
  35.     /*# I) Y* E4 m  l1 s% W2 ~) T
  36.      * Member Declarations
    : s; h+ H  a$ }1 K$ d
  37.      */
    & V- F7 v; w3 e+ k7 N
  38.      这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。
    ) H; T& u  W" B% u. u5 C8 d& G) c7 c
  39.     touchgfx::ScalableImage BackImage;  
    3 n2 I# H: }& C$ w* g2 S$ a
  40.     touchgfx::ButtonWithLabel ChangeImage;  |; Q3 Y6 o6 ], e
  41.     touchgfx::TextAreaWithOneWildcard textimageid;6 N/ ^* x8 b! Q7 t; q
  42.     touchgfx::Button NextView;( x# P, c+ m0 n; q
  43.     touchgfx::Button ChartARTViewButton;
    * @' X$ m+ Z4 s
  44. ) G% V, H3 c" C" b! l: l
  45.     /*) }; P, a" ~7 e" H7 y2 {" j% M
  46.      * Wildcard Buffers: y. `" \7 ~/ c! \( M5 W* |( Y; J
  47.      */* f+ D/ T+ [) Q5 U" b
  48.     static const uint16_t TEXTIMAGEID_SIZE = 3;1 D  q# R/ X9 ^+ y+ n# d. I
  49.     touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];- z; Z* V+ C: Y* U6 W
  50. ' w9 j9 Y6 B! [5 E4 A3 c
  51. private:
    8 m& ~- v7 j( ]) a. k+ k
  52.         这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。8 ~# E0 Y" ^3 q+ \) Z+ N
  53.     /*4 B; |, V5 M; ]* U' b3 v* j6 g
  54.      * Callback Declarations, y6 ^/ K) v4 }! D/ W' J
  55.      */
    + s: x7 j' Q3 V7 b$ A5 u
  56.     touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;) s( p, F+ n9 C0 T, o  Q: h
  57. " n8 _4 ]4 s* ?
  58.     /*
    7 ^$ I& B$ A. e& g8 `1 R
  59.      * Callback Handler Declarations
      `9 o1 f  _- m& I
  60.      */8 k- v8 w& e5 s! Y/ l; F, _3 \
  61.     void buttonCallbackHandler(const touchgfx::AbstractButton& src);1 u0 Y" }" X& P

  62. ) g" o5 a0 K, a( z, I8 V! Q
  63. };
    - O9 Q4 j/ u. |# u2 N. s/ a

  64. 1 t" @% ], \2 u2 ?6 |
  65. #endif // MAINWINDOWVIEWBASE_HPP
    , [2 w" V: g$ N: @# F+ q

  66. $ Z- P" o! c4 Z7 t
复制代码
2 S+ k' x0 Q( E5 k: D  f  u6 P
到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
3 O* \* F" @3 P  x5 ~- W9 i
  1. /*********************************************************************************/
    2 A( W; f9 Q8 p( a7 j
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
    1 K2 B( N) k& l6 D8 u
  3. /*********************************************************************************/
    0 c3 S0 S8 `; p
  4. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
    - y: O! F" G4 X, O
  5. #include "BitmapDatabase.hpp"
    + F' S$ l5 D) u; }  _( N  `
  6. #include <texts/TextKeysAndLanguages.hpp>
    9 K5 F- F  `+ t" N! G
  7. #include <touchgfx/Color.hpp>
    . ^5 a9 P. e: R/ @
  8. 3 X7 ]$ K6 [: C! d
  9. MainWindowViewBase::MainWindowViewBase() :$ L7 s6 B) N5 b8 L. }0 ]
  10.     buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)
    1 I5 b6 V. A3 ]
  11. {
    : s9 X. l; P; {% f7 a0 I
  12.         在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置; J! P; N* \& b) L
  13.     BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));: E# E8 m3 M" [, {7 b/ J+ H5 X
  14.     BackImage.setPosition(0, 0, 800, 480);
    . E5 V$ I4 [" c  x) b
  15.     BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);$ U  ]7 O  m/ \' ]! l+ v
  16. , I: l6 E2 r2 Y/ {
  17.     ChangeImage.setXY(315, 0);
    ! E  a8 V8 r. {2 n: C7 l
  18.     ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));
    # a/ c' E2 v8 e. R7 X
  19.     ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));4 V. i0 [3 D2 B3 f4 i) e$ b% S
  20.     ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));8 S5 z  N. |4 O7 h" R5 N! w0 D6 Z
  21.     ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    ) A) M. N7 f! f! t+ b7 V
  22.     ChangeImage.setAction(buttonCallback);这里可以看见添加action方法
    + D7 j8 c. r1 W" ?& P# m

  23. ( Q7 Z: t9 R! Y- u5 }# W4 N! j; H3 X
  24.     textimageid.setPosition(394, 68, 26, 25);
    / v) c, }" T) k/ [5 n0 e, e8 u
  25.     textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
    7 ^) S; q7 q+ M" _1 C8 a2 V
  26.     textimageid.setLinespacing(0);3 K# M% v" m) u0 o3 A
  27.     Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());7 p$ `  ]. A  |. T0 X4 l; G. H. y
  28.     textimageid.setWildcard(textimageidBuffer);
    - i/ d: Q/ p' W8 U- L! d2 C1 p
  29.     textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));+ |( S' k+ p4 }1 M- e

  30. " \6 Q* }+ J2 k
  31.     NextView.setXY(377, 135);/ }; r: ~/ }9 I
  32.     NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
    1 z! }4 M/ d3 T) I. {0 r3 m
  33.     NextView.setAction(buttonCallback);
    7 w+ f2 c( @! V- _

  34. ; H/ z4 Z& v- P0 B
  35.     ChartARTViewButton.setXY(377, 230);' `. P. V# F% A! O+ @- ]+ D
  36.     ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));
    0 g% c! P5 [& x% D; q
  37.     ChartARTViewButton.setAction(buttonCallback);页面切换的action函数  k) q7 Z( C% i1 g3 d7 C, p& a: I
  38. 在窗口上添加控件方法
    . b9 Q& z& J) X  z
  39.     add(BackImage);
    - e7 `" l* D/ ], F5 `& N- c
  40.     add(ChangeImage);, v7 a* k8 b, l" z) R
  41.     add(textimageid);1 \+ V) D+ S7 ?" f4 z  `
  42.     add(NextView);
    $ Z+ ~7 _5 l, S/ p
  43.     add(ChartARTViewButton);4 z9 p  S2 S2 ]5 H$ ~
  44. }6 ?( ~9 f) X. v$ E+ v1 R

  45. 3 Z$ `! ^' u8 C4 _- K% U/ z
  46. void MainWindowViewBase::setupScreen()
    % C: M* e+ Z# o
  47. {
    % ?# ^) ?* m; B% G
  48. 8 K; W8 K+ `* d: F  p: c. g
  49. }
    4 I# t3 P1 c7 b" {9 L

  50. 8 r( Z4 Y& U" E7 S" k- Z
  51. void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)- A% h8 Y. Z# S) N
  52. {
    - a( ~4 W+ p& A: b  ?7 Y' a
  53.     if (&src == &ChangeImage)
    ( w, j/ c# d- J4 y) n. h
  54.     {3 S: u; f- J8 P( Z
  55.         //Interaction1$ o8 w" `, h0 s/ O, l% \
  56.         //When ChangeImage clicked call virtual function
    6 L; M( ^$ T& g
  57.         //Call setBackImageIMG. j# M" H- y& J+ v  t
  58.         setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。
    # ^! d4 ]: H3 b5 g
  59.     }
    ' M" Y1 K  {5 o, g! i/ L" K
  60.     else if (&src == &NextView)
    9 t$ r; s. n8 ]6 @
  61.     {1 O* P% ^) r2 u3 [" h
  62.         //Interaction2" |- v1 j% \* _/ Z% y
  63.         //When NextView clicked change screen to TabView
    7 F! X. x8 D0 j
  64.         //Go to TabView with screen transition towards East. S. ~& y# N$ d4 |7 @/ Q# v% l6 i2 P
  65.         application().gotoTabViewScreenSlideTransitionEast();2 F7 |7 v9 Y+ Y
  66.     }
    & q" ^9 A5 c% k. o( x7 w
  67.     else if (&src == &ChartARTViewButton)
    6 l; U1 i1 n# W" |; i& j
  68.     {
    # R+ s# E8 n$ R  Z* s
  69.         //Interaction3- y; J8 m  v/ r; ^
  70.         //When ChartARTViewButton clicked change screen to ChartView
    / b. P0 Z- J& @7 X
  71.         //Go to ChartView with screen transition towards East# n% t% F% E) {
  72.         application().gotoChartViewScreenSlideTransitionEast();- |/ T% A, L: f* n
  73.     }
    / {4 A  n9 E% d3 ~
  74. }
    8 R2 l+ g7 ^, e5 D3 V
  75. + G6 i1 C  m# r+ ?& z
复制代码
( w1 K4 l! G: ~$ x/ s
由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。
& n+ M- e' C7 J; [$ l
" ^  `& q, a) b5 B. Y* k' H

5 L# {4 T4 u1 F* @" {9 f" L+ wView类的作用
+ N# J7 l" ?$ V; Sview中的内容是可以进行修改的,可以根据需要添加自己的使用方法。! t& p) U: S* e! G+ s
下面我们再看一下MainWindowView.hpp文件。, M8 }& i0 n; }7 m9 P
  1. #ifndef MAINWINDOWVIEW_HPP4 y( ?# ?6 X8 t1 c4 f
  2. #define MAINWINDOWVIEW_HPP/ B5 ^: l+ e- O- A; d. i; @

  3. & }1 P# R. b* B
  4. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
    . B! l% C2 x- s+ z5 b6 D3 c! {$ b) Z% d
  5. #include <gui/mainwindow_screen/MainWindowPresenter.hpp>, E7 O3 c, d! h8 h$ N
  6. % q4 H% K0 m+ x2 K

  7. 7 F, c* o: r7 T
  8. class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase, {* s8 D* n: D* ?/ D+ g6 }
  9. {
    , o0 |2 W; X  O  F: M
  10. public:
    ; ?5 y; Z- c7 ]) p$ Q$ i( a
  11.     MainWindowView();
    8 x, x- Y( M2 V( J( d1 ?' v" @$ ^9 i$ w
  12.     virtual ~MainWindowView() {}+ Y& y) J0 c8 a% g
  13.     virtual void setupScreen(); 正常创建时,到此处就没有了。
    / d  B2 x1 s: _. v1 g* V
  14.     下方的文件是手动添加的,如果在界面上创建了function函数,# R* k7 c! t+ @' |# F
  15.     则在该文件中添加一样的虚函数,具体在上方的base中能看出来。: o6 @- n3 \: Q# V" V1 b
  16.     virtual void tearDownScreen();* D2 S+ s! A2 [( F& c4 M( \+ @( u
  17.     virtual void setBackImageIMG();* h* }: D0 w0 V- `$ Y$ c
  18. protected:3 F" \  y9 ^. X0 v
  19. . A- [: W# Z% w5 p' C
  20. };( o, y0 d3 o' C6 \- ]: r

  21. , i: c$ ^7 g+ R7 h9 p
  22. #endif // MAINWINDOWVIEW_HPP! H7 [7 k% r' P5 ?/ O
复制代码

; |* L+ c: L2 V8 D6 P此时就可以在cpp文件中添加相应的函数实现了。6 V9 V1 k( u0 O

/ R, b& k3 r- Q. D按键事件响应逻辑, |/ ]. T/ d0 B: w3 }* E9 D
好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。' X% h" x' X* c4 b6 f
除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。
$ a+ v! o/ K2 h) Q* `————————————————
0 h) L" H- ~' t! g版权声明:空闲的程序员; J8 Z7 G1 C& t$ e( C

, a$ \8 t: J* |( O) M9 c7 h3 T- g
. K2 ~; }9 F& Y- [3 Y0 L
收藏 评论0 发布时间:2023-3-5 12:26

举报

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