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

STM32 TouchGFX经验分享(二)

[复制链接]
STMCU小助手 发布时间:2023-3-5 12:26
通过TouchGFX创建事件逻辑函数! d+ T& q2 |! t$ b# b  C: y
TouchGFX Designer中的交互由触发器和动作组成:/ S+ \9 w9 g0 @) X
触发器:是由用户点击或者进行其他操作后产生的信号。
% ?7 Y. b: }: p) @4 `& i/ d4 D动作:由触发器触发的相应的事件逻辑。2 k. D5 \3 Z$ {* n9 `+ l& Z
要添加interaction ,请转到任何屏幕或自定义容器的“interaction”选项卡,然后按下标有“Add Interaction”的蓝色按钮,如下图所示。& a, |! B3 x& P1 k
2 f# ^! c, i+ o* Q; K  a
20200617134948186.png
# ]$ {) |, M, f2 A9 @
% R; T& f- A7 s, {! Z' e
添加后界面样子如下:
, S7 u3 f& e& ~9 x' e2 f. a6 X/ D6 |- P( c( U/ A
20200617135151986.png ! b8 j- Q! w8 ~7 g

  T; n6 L+ N. x& t. F- ?: b7 ^2 ^; LTrigger中用于添加触发器类型,例如:按钮点击事件。Choose clicked source 中添加被点击的是哪一个按钮,这里显示的是“button1”。" u8 `$ k' x8 k7 `6 d4 l, b
Action:action的操作分为了两种,第一种是作为基础窗口的动作:0 Z/ ]1 g2 w8 Z
该种动作包括:
3 t( R# ^* D  W- h2 e& }) y
# h  k7 f& b, ^
@0]H}(7%UT3U9A$ZUH3~I.png 0 [* ?" X  X& S* \4 K3 T0 J  u
8 B* |; F1 O9 o( i, o& `
第二种是控件的属性提供的动作:( ?2 L7 ~' D% B& l2 [$ u
/ W1 E2 p& i& d2 x' u' x
N`CP]_(0Y_JS[UG_QGJC)VS.png 5 e& h5 b4 y2 K1 p) B

. H. p2 Z" P  {# }; A: r在上图的底部存在Can trigger another interaction的复选框,它的作用是连续动作,当一次触发事件后多次响应其他的事件。7 c! k  U+ G/ d# _
4 A  n$ u* H! [
Base类中的秘密
0 G9 F! g7 @3 c, h1 ~* Z$ P在通过TouchGFX Designer创建完界面,并在界面中添加完相应的触发器后,生成的代码中将会存在相应的界面基类,这类代码是由TouchGFX Designer自动生成的,所以不建议更改,在第一章也和大家说过,下面我们探索下这个类中有些什么:9 S$ a. c2 c& V, A8 T1 B0 K
我们以我写的一个例子做讲解,该demo源码在第一张中可下载。看下图
: j# t, C6 ~/ B6 X7 l. K6 i8 J8 `2 Y5 E' ~, h1 _

5 e4 c1 X  m- S! u7 C, Z9 W) h 20200617141157230.png
) ?& H+ J' `. C1 Y( e8 p3 ?) _
我们以MainWindow窗口作为例子讲解窗口基类中有哪些东西,首先窗口的名字叫做“MainWindow”,其中包含和三个按钮及一个text area还有一张背景图片Backimage。放置的顺序不同在界面上体现的层次感不同,如果将背景图片放在最上层的话其他按钮都将被盖在下面。其次看右侧的interaction,在其中我添加了三个逻辑,类型都是按钮的点击事件对应的是三个按钮,相应的功能是“Call new virtual function”,在下方写了函数的名字。注意函数名字和控件的名字,此时,点击Generate Code 按钮后在VS中打开工程。可以看到在头文件和源文件中generated/gui_generated文件夹下有mainwindow_screen文件夹存在,在该文件夹下将存在该界面的基类。如下图:* Q) d' {& u) K4 Y; f: p* b

) R& E& R* B5 Y" S7 `! F
2020061714214482.png % H8 K! V& s+ r0 B. H: G7 C

0 [* K5 V  ]+ X6 M$ E7 d8 I我们看下该类中的头文件:
1 J* |0 @: `8 z4 l- k  y
  1. /*********************************************************************************/
    , x/ [2 F" g/ H% E/ j
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/1 E, w7 f% P  ^6 @! ^  e( ~
  3. /*********************************************************************************/  x" j- u5 ^6 k$ f
  4. #ifndef MAINWINDOWVIEWBASE_HPP
    * M' N# Y% M" C( a% Z
  5. #define MAINWINDOWVIEWBASE_HPP# H1 S" H" x2 g  l( M
  6. : ^6 ?+ v* l* |9 m
  7. #include <gui/common/FrontendApplication.hpp>
    7 Z$ S+ k+ `) }& Y& l; ^8 [: W
  8. #include <mvp/View.hpp>
    3 i) A+ L) @# D+ W
  9. #include <gui/mainwindow_screen/MainWindowPresenter.hpp>
    , E9 G: L+ @7 B) p$ s
  10. #include <touchgfx/widgets/ScalableImage.hpp>( L! p* r" M( d7 `* j
  11. #include <touchgfx/widgets/ButtonWithLabel.hpp>
    ' x) z# _1 E3 g: u, g2 j3 w, D
  12. #include <touchgfx/widgets/TextAreaWithWildcard.hpp>
    8 }) o! |4 G% D1 B  o
  13. #include <touchgfx/widgets/Button.hpp>
      ?9 e) G0 J2 `0 a9 B" U
  14. 8 b1 I" @# D9 M# h
  15. class MainWindowViewBase : public touchgfx::View<MainWindowPresenter>
    , [* x0 S7 k( K7 V7 f& `- z
  16. {* w. L5 _+ F7 ~9 n+ v
  17. public:
    ( W  \8 ?  E* ?9 n. L. J0 H5 I9 c! u
  18.     MainWindowViewBase();
    " A; U( M2 T' N: O6 }
  19.     virtual ~MainWindowViewBase() {}/ J7 l% E( k; v* H" c2 k7 G
  20.     virtual void setupScreen();  窗口创建时响应的函数* b) {+ z$ p3 L

  21.   e9 |- P# d9 t0 Z" M- Q- T; _: l
  22.     /*
    + G" i# B+ z2 N7 A
  23.      * Virtual Action Handlers
    ( N( K1 J+ r! A. q/ X5 ~8 _
  24.      */: [4 H" K6 g% Q* x+ @9 k9 j
  25.     virtual void setBackImageIMG() 这个就是在TouchGFX Designer中function name 中填的名字他就是Designer产生的关联性。. ]# f# f: X1 s4 y! c0 A
  26.     {# G" J, X$ [6 X6 M- J+ ^3 \2 `5 D
  27.         // Override and implement this function in MainWindow8 v7 R% _+ u8 Y
  28.     }
    3 ^4 a/ d" V4 Z7 h  Q6 D
  29. " B+ X* ^. h3 ]3 r/ s
  30. protected:
    7 H, v. O2 I0 w8 z. ~; Y
  31.     FrontendApplication& application() {
    2 o3 P; J. t" m0 d4 R, _6 P
  32.         return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());& }% m8 H( A5 M+ o/ ?
  33.     }
    7 y0 v% z% o. `

  34. 2 Q, M8 C% k) J, b9 X
  35.     /*
    # f* ]  I6 H" z  [" S# {1 [) Q2 w
  36.      * Member Declarations
    3 y: W# L' g' ~7 ?( k( r
  37.      */
    3 @8 |; |6 E% V( ]
  38.      这部分放的就是界面上控件的名字,也就是说如果想要修改控件的动作或者状态,除了TouchGFX Designer中修改外,也可以通过代码调用定义修改。; B- o( P8 L4 b+ V7 B- {
  39.     touchgfx::ScalableImage BackImage;  
    2 ?# @; W2 i+ G% g4 _7 ]3 C
  40.     touchgfx::ButtonWithLabel ChangeImage;7 i4 J6 a. ?) M. H
  41.     touchgfx::TextAreaWithOneWildcard textimageid;, R& [- O: z. P& H# P& K' S4 l( @$ c5 D
  42.     touchgfx::Button NextView;
    * E6 ?. d% ^$ l5 X* Z
  43.     touchgfx::Button ChartARTViewButton;' r0 o# K0 m( X
  44. : i6 u3 S1 c/ G1 T. ?) d- N% b
  45.     /*; x2 Y" P/ q# D: O: \. P
  46.      * Wildcard Buffers' y7 q) Z6 J7 H) _
  47.      */( N. C: `! ^( G& m! f7 u
  48.     static const uint16_t TEXTIMAGEID_SIZE = 3;, p% I; q8 n$ `/ k7 ^. y# G
  49.     touchgfx::Unicode::UnicodeChar textimageidBuffer[TEXTIMAGEID_SIZE];& Y. R& Q2 [6 v8 {( W% t5 H+ x7 r$ D) \" @

  50. : [0 y" S* k9 n5 W2 r" \! X
  51. private:
    1 b" q2 @* ?* d7 A, F0 F
  52.         这个部分就是 通过TouchGFX Designer中interaction响应的逻辑,具体的一会在cpp文件中将会看见。
    ! b. g6 k: C  |% W5 G
  53.     /*
    & c& e+ a* d5 I. ]: D6 r3 ^
  54.      * Callback Declarations( G& c+ Y: K: Y$ J5 q
  55.      */
    # E" j. Y+ K( e+ y
  56.     touchgfx::Callback<MainWindowViewBase, const touchgfx::AbstractButton&> buttonCallback;) P1 r* _$ q. Z# C# ?! V  |
  57. - r  s9 a& t- d1 B' `5 v
  58.     /*
    , L/ z8 C, U9 I1 L& w
  59.      * Callback Handler Declarations
    $ f. r! y' \8 \0 p* S
  60.      */$ K+ V4 \3 }$ X( j2 q  H& R
  61.     void buttonCallbackHandler(const touchgfx::AbstractButton& src);
    : x# G% r1 h- ^

  62. ; p) u6 y' D2 y; H. X; E
  63. };
    5 h; P" t# M) ~  _
  64. ; n. ]; j2 ]( {/ b1 j
  65. #endif // MAINWINDOWVIEWBASE_HPP% _: Q3 W4 i; X1 y
  66. 0 G6 O! j" L5 ?0 \  ~
复制代码
" z' y! u6 Z1 n( z3 e+ v5 j
到这里MainWindowViewBase.hpp文件参观完了,可以接下来参观cpp文件了。
6 k/ [9 D, T- \- Z( C8 U4 g6 w
  1. /*********************************************************************************/
    9 c) y! V, M2 k( n# z
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/
    : g) {: `# Q1 s- Y2 M" x0 k, b) `
  3. /*********************************************************************************/
    ; {% B0 O9 L- b. N4 T$ {
  4. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>4 t, G; `: r9 ?
  5. #include "BitmapDatabase.hpp"
    3 ^, ~$ H2 `. Q
  6. #include <texts/TextKeysAndLanguages.hpp>
    ; w4 A3 {9 }4 l( B5 q; ]0 k7 ^! r3 A
  7. #include <touchgfx/Color.hpp>
    ! t/ i* i7 ?+ L7 F0 ?$ L5 C

  8. / C4 \  ^' d, @0 _- t
  9. MainWindowViewBase::MainWindowViewBase() :
    1 G$ t- W% P: I% B: |: {7 p" Y
  10.     buttonCallback(this, &MainWindowViewBase::buttonCallbackHandler)
    9 a9 C/ q; j8 I! M" G
  11. {
    ' r7 H3 K3 R1 z, O- S* T: y
  12.         在构造函数中可以看见我们添加的控件在cpp文件中体现的样子包括设置图片或者设置位置4 J& L+ E. [) s5 a' Z1 Y
  13.     BackImage.setBitmap(touchgfx::Bitmap(BITMAP_IMG1_ID));& p, w! V5 B/ g' l  t3 v
  14.     BackImage.setPosition(0, 0, 800, 480);
    , E  \, ]6 \# X: n& y
  15.     BackImage.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);
    , N  q* f# \' V: l
  16. 1 e; d/ ]; ~6 s
  17.     ChangeImage.setXY(315, 0);6 ]. h% [  m( F! Y( c/ c
  18.     ChangeImage.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_SMALL_PRESSED_ID));) h# A8 I2 [. e' `( u  K
  19.     ChangeImage.setLabelText(touchgfx::TypedText(T_SINGLEUSEID1));; y. ^' x- m9 u5 ?6 G6 i
  20.     ChangeImage.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    ; Y' |: W5 n3 B8 g
  21.     ChangeImage.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 255, 255));
    * z& @+ \$ }3 x* ?% v
  22.     ChangeImage.setAction(buttonCallback);这里可以看见添加action方法
    ' a" X+ N2 o7 _) k9 y( Z
  23. 2 T) X6 s+ D: `' k9 O  f
  24.     textimageid.setPosition(394, 68, 26, 25);6 F! w+ L7 q2 s  T2 c: ~5 o
  25.     textimageid.setColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
    ; k& \$ i& z) R* x9 K& f& R. H: ?
  26.     textimageid.setLinespacing(0);
    * V: l% U( m4 o1 D+ U' ^+ t
  27.     Unicode::snprintf(textimageidBuffer, TEXTIMAGEID_SIZE, "%s", touchgfx::TypedText(T_SINGLEUSEID3).getText());9 p2 w& a  Z* B* h$ ]: ?% ?" h
  28.     textimageid.setWildcard(textimageidBuffer);) S3 |3 g9 C- o& F* F
  29.     textimageid.setTypedText(touchgfx::TypedText(T_SINGLEUSEID2));
    / O) b* k# o/ M
  30. $ a, [* C7 N  c2 _
  31.     NextView.setXY(377, 135);
    ' p( M) W7 I) S# Y2 C3 W( R* R: y
  32.     NextView.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));1 ?: ~8 W4 _9 d' S/ U" P
  33.     NextView.setAction(buttonCallback);' C/ [& d- G9 M; b% _8 J7 i( x
  34. 3 O4 k  ^7 N6 R) h
  35.     ChartARTViewButton.setXY(377, 230);
    ) c8 I, p: u' `, D: l" p
  36.     ChartARTViewButton.setBitmaps(touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_ID), touchgfx::Bitmap(BITMAP_BLUE_BUTTONS_ROUND_ICON_BUTTON_PRESSED_ID));  ~: `) Y) v  x2 l9 ?
  37.     ChartARTViewButton.setAction(buttonCallback);页面切换的action函数! h6 i" D1 u* t8 N
  38. 在窗口上添加控件方法; ~, L. S- K- }9 _3 m9 i
  39.     add(BackImage);
    1 Q. m4 j. Z& l9 ~! R7 l, Q
  40.     add(ChangeImage);
    ; ?' N: C1 V  o) |
  41.     add(textimageid);
    ( c5 t9 R* J( d0 d) }
  42.     add(NextView);: H) T3 C) \% W! ^4 F6 y
  43.     add(ChartARTViewButton);
    ' j: h5 N- j8 x  \) A
  44. }
    ! @+ n7 l$ m" W$ o
  45. ; k' X& @5 R4 p  A% p, x( d( ?
  46. void MainWindowViewBase::setupScreen()
    $ q/ U3 ^" o3 e2 c* Q$ c0 f
  47. {8 ]; u, H$ z+ ~$ l) V5 Z' C+ K) R

  48. + p. P! [* P5 [! T
  49. }% G( l! C8 U% }) W  Q

  50. ) m+ W7 r% r* r, B% Q
  51. void MainWindowViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src), m2 h2 T- I" L" W4 I& i" t
  52. {  r$ Z7 X5 |( h/ E, L! ~4 Z, r, E; C
  53.     if (&src == &ChangeImage)4 z: H. p$ j% {/ p
  54.     {
    " J0 S4 X3 m% s% d: z
  55.         //Interaction1
    - r9 O5 Y/ n- F
  56.         //When ChangeImage clicked call virtual function) S2 Z5 A& g, ]& v
  57.         //Call setBackImageIMG
    / D; V4 B; r1 m+ _  f+ G7 l( I
  58.         setBackImageIMG();这里可以看见是通过callback函数响应的setBackImageIMG函数,由此可以知道以此方法我们可以自己在界面上添加控件,而控件响应的函数也可以这样添加。注意要是自定义添加不要在base文件中添加要在界面类的函数中添加。
    5 C$ r% T# H( }3 x) q% X
  59.     }
    . g) H# r3 e7 P' u% J$ n$ r
  60.     else if (&src == &NextView)+ ^9 a7 O* _% ]" {2 C
  61.     {
    - W, a5 E3 U( {
  62.         //Interaction2+ e/ _" C5 N. a: q
  63.         //When NextView clicked change screen to TabView: z0 H( L2 _4 o' T
  64.         //Go to TabView with screen transition towards East
    6 J$ s/ Z3 q$ `; ~2 S0 R
  65.         application().gotoTabViewScreenSlideTransitionEast();  p, E8 D, }( A
  66.     }' `, m, e7 j; w+ G1 [( A/ a; o
  67.     else if (&src == &ChartARTViewButton): G3 T. j% k4 q& K
  68.     {
    1 ]3 \) ~. M( X( y: r, B/ m
  69.         //Interaction3
    # Q  O6 W" j2 @( J& Q9 p4 \
  70.         //When ChartARTViewButton clicked change screen to ChartView. p: Q" z# [' d7 l/ B7 V$ }
  71.         //Go to ChartView with screen transition towards East- [5 }5 B! m2 {
  72.         application().gotoChartViewScreenSlideTransitionEast();; c3 U3 W2 s" {2 o, C
  73.     }! Y- v1 {7 Z- i5 N8 i" r$ ]
  74. }% @6 R0 J. U, e& [
  75. % D( x9 ~) \" ~  D! L0 v9 Y5 _: ~
复制代码
4 h& |$ A9 y' f; ~# P) V8 Y
由此可以看到创建的界面后,base文件中的状态。下面会给大家展示一下view文件中的内容。
5 Z5 v' p- U- H
- Y$ F0 N* ~* ?
9 F$ Y+ O4 a2 @* B5 x0 Q, D' B
View类的作用$ ^1 |$ I  V" }/ ]2 a; X% y& s
view中的内容是可以进行修改的,可以根据需要添加自己的使用方法。
9 @  q% O) [5 I  u  O下面我们再看一下MainWindowView.hpp文件。& {7 V5 i  s% a9 p- i& v1 m- J
  1. #ifndef MAINWINDOWVIEW_HPP
    5 G7 i, v/ H9 l# X/ ?
  2. #define MAINWINDOWVIEW_HPP' z- j$ b  J0 A* f# z/ i* N

  3. ' }" b7 i- y, D% }4 ^6 @
  4. #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
    $ o( W" }# T( U, k# D
  5. #include <gui/mainwindow_screen/MainWindowPresenter.hpp>( f1 K3 N+ e- I, r" u8 ?
  6. . B! E9 \/ Y  y/ ^+ y5 T

  7. 1 L2 h: w7 ]+ A" d! B) u: P: h
  8. class MainWindowView : public MainWindowViewBase这里看见这个类是继承上方的基类MainWindowViewBase$ g% \8 w7 k# a; w
  9. {3 g: p: U! S7 D/ t
  10. public:
    8 |: A( D" ~& m5 r6 K! G9 O
  11.     MainWindowView();* t1 y' W8 J+ L+ {) @
  12.     virtual ~MainWindowView() {}/ |) F$ H. D5 t) @% k& Y7 S# u
  13.     virtual void setupScreen(); 正常创建时,到此处就没有了。7 h" ]5 ^7 G; x* d1 M, F! s
  14.     下方的文件是手动添加的,如果在界面上创建了function函数,
    , K- F. d2 a) }5 O3 f
  15.     则在该文件中添加一样的虚函数,具体在上方的base中能看出来。2 V, e- [* O8 Z' \
  16.     virtual void tearDownScreen();
    , u" p4 N' `9 ]8 f( x& m) u. ^
  17.     virtual void setBackImageIMG();
    + J3 U6 E, s  P& y% a7 w2 \8 ~/ K
  18. protected:" S# d1 Y' ]$ P
  19. 2 b0 t( Q6 @& ?2 C
  20. };3 u$ M2 o9 q  Z
  21.   z9 g$ Y7 I' D. q; B! x" I0 `6 Q
  22. #endif // MAINWINDOWVIEW_HPP
    / k2 A, a, |/ P8 V9 ^0 O2 ~1 r
复制代码

' Y6 ?4 B5 w/ q3 P此时就可以在cpp文件中添加相应的函数实现了。
; L! A% f2 S1 k4 Z1 \. J
! B( e7 t5 ?/ R4 G
按键事件响应逻辑* N$ a7 X* _6 \5 p8 I) `  J
好了说了这么多,我来给大家总结一下吧,通过TouchGFX Designer创建一个界面,在界面中可拖拽控件,在TouchGFX Designer下也可添加相应的action函数,在添加完函数后,要在view文件中加入相应的虚函数。
7 ~+ N& K# I1 E" S5 p除此之外,还可以模仿base文件的方法在界面类中添加相应的button及button的action文件。此章给大家介绍了创建事件的注意示项。# X% P% l/ n0 m5 ]6 k, r
————————————————) y5 `# n5 A: A/ P
版权声明:空闲的程序员
7 ~4 z# U! R4 g  q) U# W) ~1 G3 D$ X  Q
$ I$ K, O) `1 Q6 j* q+ N
收藏 评论0 发布时间:2023-3-5 12:26

举报

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