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

【安富莱STemWin教程】第44章 FrameWin-框架窗口控件

[复制链接]
baiyongbin2009 发布时间:2015-3-3 11:57
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
4 |& K; G4 `- u! ?4 ~  H
第44章 FrameWin-框架窗口控件
/ y/ \5 Y& L) V$ H: f
    本期教程讲解STemWin支持的框架窗口控件。
    44. 1 框架窗口控件介绍
    44 2 官方WIDGET_FrameWin实例
    44. 3 总结
44.1 框架窗口控件介绍
    框架窗口为您的应用提供一个PC应用程序的窗口外观。这些窗口由周围框架、标题栏和用户区组成。标题栏的颜色改变以显示窗口是否激活,如下图所示:
44.1.png
    如下图所示,可将预定义的按钮附加到标题栏,也可将自己的按钮附加到标题栏:
44.2.png
    设置皮肤后显示效果如下:
44.3.png
44.1.1 框架窗口的结构
    下图显示了框架窗口的详细结构和外观:
44.4.png
    框架窗口实际上由2种窗口组成;主窗口和子窗口。子窗口称为客户端窗口。处理回调函数时意识到此点非常重要:存在具有2种不同回调函数的2种窗口。创建子窗口时,这些子窗口通常作为客户端窗口的子窗口而创建;它们的父窗口因此是客户端窗口。
细节
描述
B
框架窗口的边框尺寸。默认的边框尺寸为3像素。
H
标题栏的高度。取决于标题所用字体的尺寸。
D
标题栏和客户端窗口的间距。(1像素)
标题栏
标题栏是框架窗口的一部分,不是单独的窗口。
客户端窗口
客户端窗口是一个单独的窗口,作为框架窗口的子窗口创建。
44.2 官方WIDGET_FrameWin实例
    官方的这个实例简单的演示了FrameWin的部分功能,这个例子在模拟器中的位置:
44.5.png
源代码如下:
  1. #include <stddef.h>
    + n! }& l8 g7 T- N
  2. #include <string.h>
    8 o+ c: ?6 A/ d" ~0 q7 m
  3. #include "GUI.h"
    : s# o% G, M! D$ d4 x( R
  4. #include "FRAMEWIN.h"
    # p) F0 |& z  g  G, u- q

  5. 6 k- m- t1 z3 x% G) L
  6. /*********************************************************************! @! ?) @5 z( ~# s% n0 Q
  7. *
    & ~. Z7 M0 m9 \! f( w% e- _, L
  8. *       Defines2 j; |5 u  {! Z1 v7 G- ~* y
  9. *; t' l9 P1 \2 A; V
  10. **********************************************************************
    9 m9 e5 r' y% {
  11. */
    ; H# f+ Q& m" T& r3 v
  12. #define SPEED   12008 B; N1 |5 s7 U/ T
  13. % Z* ~& i5 x6 L1 R: A
  14. #define MSG_CHANGE_MAIN_TEXT (WM_USER + 0) (1)' E$ J) c2 I+ L8 ]7 T& a- ^

  15. & c. V/ ?1 ^  N" U5 [
  16. /*********************************************************************
    3 Y5 T/ f. U" r: a
  17. *, U1 A. \, _" b* z$ H3 ]0 H/ |" b
  18. *       Static data" K5 [. p. B( U4 T6 J/ z! F
  19. *% a$ A+ D, A: u$ ?) x! F
  20. **********************************************************************
      f8 ?/ I" M( I, u+ c. F
  21. */
    ( X) @2 R8 K6 u( i
  22. static FRAMEWIN_Handle  _hFrame;' S+ f2 Z) u7 E: \2 V0 w
  23. static WM_CALLBACK*     _pcbOldFrame;
    , X0 z; _. i" g3 T
  24. static char             _acMainText[100];
    7 m/ w* P( w5 F; R' b
  25. static int              _LockClose = 1;
      y7 S4 Z$ B4 d6 ~
  26. 9 i! U% V7 D" [
  27. /*******************************************************************0 c- K- P; @0 M) I" a
  28. *! K# v4 w- S, A8 O: i1 s4 p
  29. *       Static code" s, L7 E& c* @
  30. *" _5 J1 o, \- s7 j, T' |% }8 e. Z
  31. ********************************************************************
    + P  n4 C$ G2 Y2 C! c4 {
  32. */
    $ U6 j3 N$ }- r  B
  33. /*******************************************************************
    + i: R* M% j* I. l5 ~
  34. *
    4 n4 ~" f& n# F$ h4 C* D4 u5 D3 F
  35. *       _ChangeMainText7 M. W( ]# u6 A3 g
  36. *+ ?( P7 h, A: [0 a- d3 A2 p( C2 g
  37. *  Sends a message to the background window and invalidate it, so
    7 J- B, f; C3 N! C) Q$ P7 R: \4 V
  38. *  the callback of the background window display the new text.
    . z2 r4 l" Y$ o3 v1 Y
  39. */& [3 I! l$ k7 m3 [% o+ O
  40. static void _ChangeMainText(char* pStr, int Delay) {(2)" c! L. x( n* G0 }' T2 p) e% u
  41.   WM_MESSAGE Message;/ M0 A: B9 M" A. R
  42.   Message.MsgId  = MSG_CHANGE_MAIN_TEXT;
    9 T" ^: M* @# Q; R5 I
  43.   Message.Data.p = pStr;0 i' o2 [8 c) S
  44.   GUI_Delay(Delay);
    % f; ]0 w  V& \* P! r& z7 q
  45.   WM_SendMessage(WM_HBKWIN, &Message);
    3 H; S8 Z8 j6 z' R$ X$ q
  46.   WM_InvalidateWindow(WM_HBKWIN);2 {: t$ n( Z# l
  47.   GUI_Delay(Delay/3);
    1 L' z8 L% x6 B) q# i
  48. }
    - S0 M7 U8 \, s" d$ l# q, N
  49. 9 w( I% `0 A% K, m" z' {( J. }% J# G
  50. /*******************************************************************
    " o" T) @% |5 a; u) t; Y( j
  51. */ s4 ], m2 G' b$ V$ N; }
  52. *       _cbChild5 P$ ~, K4 e8 U6 [: U0 e
  53. */8 G) u5 R% m( V  u) P% v
  54. static void _cbChild(WM_MESSAGE * pMsg) {(3)
    6 \/ [# {& Y' O8 D8 ^2 i
  55.   WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);
    , |2 h- m1 J. o: k; s: \! [: k- T, P
  56.   switch (pMsg->MsgId) {
    0 r" K- c9 m, W" j5 r2 q3 a
  57.   case WM_PAINT:
    . w0 \: `6 l  Q
  58.     //
    1 Y+ X( ^: H! H& r+ c
  59.     // Handle the paint message
    6 g& D* n6 K$ V9 _" G: H2 Q
  60.     //
    ' x/ W( Z) q' D" l
  61.     GUI_SetBkColor(GUI_WHITE);5 [. L  P6 @* E  H2 }# H, C
  62.     GUI_SetColor(GUI_BLACK);+ L2 O1 t5 G$ A% {
  63.     GUI_SetFont(&GUI_FontComic24B_ASCII);: W9 x4 Q' }0 ~" ^
  64.     GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);; z; c. |6 H% k/ a7 N% w" l+ _
  65.     GUI_Clear();, m- ^+ n4 G2 a
  66.     GUI_DispStringHCenterAt("Client window", ; B) L" R* |) K6 x9 E  p8 {# |1 x
  67.                             WM_GetWindowSizeX(hWin) / 2,
    $ P3 w+ R. i2 E) w1 @! S& d0 w
  68.                             WM_GetWindowSizeY(hWin) / 2);
    4 X% p& y. m; o/ S' m. l
  69.     break;) I' Q) d" ]: r4 O- f; m4 G  f8 E) s
  70.   default:
    % a1 i* X  t9 ?" i' q
  71.     WM_DefaultProc(pMsg);) i, [/ b3 i/ u) K9 p. [3 S% D5 G
  72.   }
    3 y- t. ?0 \% f' [
  73. }
    / R- F, N4 I* b! W
  74. 9 V9 W* s# E8 d/ X  T) m. s
  75. /*******************************************************************
    ; y, q! B, ?' z- k" p8 ?4 h* m
  76. *
    0 Q+ I' g8 P8 {7 E( Q: D2 _( j9 D
  77. *       _cbFrame
    - A4 [; t5 H1 b4 h" b+ Z
  78. */
    + W0 r7 @) T, |1 s4 B
  79. static void _cbFrame(WM_MESSAGE * pMsg) {  (4)  a* J5 M/ R/ u" F' ~
  80.   switch (pMsg->MsgId) {
    " p/ t8 T! Q! u. J8 R
  81.   case WM_NOTIFY_PARENT:$ {& c( h5 Y* Z+ d: r" r+ J
  82.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {4 O  [7 W9 f6 l; u1 y
  83.       int Id = WM_GetId(pMsg->hWinSrc);      // Id of widget& n8 W, e0 q  O/ p5 [
  84.       if (Id == GUI_ID_CLOSE) {
    8 e1 O2 i: A# u6 z
  85.         if (_LockClose) {  R5 B- O7 C2 z, G( Z  N
  86.           return;
    + T5 Z( w6 g; K0 L. n) w
  87.         }
    ( D# [' A/ N! j& P3 e
  88.         _hFrame = 0;
    ! Y, o. n2 \3 M* s0 W
  89.       }' V1 d# v/ K2 E$ l8 d- O
  90.     }
    ) d* z: H0 V* ^6 Y3 {
  91.     break;; s+ Z5 s/ `3 ^$ i/ I! V- s5 ~
  92.   }/ h: k1 O/ U) {: a, W6 _( c
  93.   if (_pcbOldFrame) {
      u3 T6 s' Q1 I/ ?1 W8 r3 |* M
  94.     (*_pcbOldFrame)(pMsg);
    . a5 Z" j( L1 y$ t0 n5 Y
  95.   }; T7 c& B  j9 m- \
  96. }3 E& Z8 ]$ a/ [' w
  97. / g! _4 A% |# a
  98. /*******************************************************************1 V/ ]& Q& B4 e, n# u' i( [
  99. ** e$ ?$ s$ k, N* {
  100. *       _cbBkWindow- M- P1 P, A) w7 K! R
  101. *
    1 G/ m2 `5 O* Y% q: C* g
  102. * Function description6 A$ }. q% i# j; q5 t- ]3 s% h4 E7 K
  103. *   This callback is necessary to redraw the background when
    9 \( A  u! U- \  U6 W1 v7 ~
  104. *   frame window is moved' ^. G7 k4 _$ A+ `' y1 G+ I
  105. */3 C* m! ^; Y9 E3 _8 |" f- i
  106. static void _cbBkWindow(WM_MESSAGE * pMsg) {(5)( |2 k' M. y! I* l
  107.   switch (pMsg->MsgId) {" k& K3 E$ o7 i
  108.     case MSG_CHANGE_MAIN_TEXT:
    & S- T2 V7 L7 _5 L( N
  109.       strcpy(_acMainText, (char const *)pMsg->Data.p);2 ]+ {" J4 x' p$ w2 W
  110.       WM_InvalidateWindow(pMsg->hWin);
    ( y7 v: E* f' H7 T
  111.       break;
    $ T$ m6 Q, C! R% ~% e: S( g
  112.     case WM_PAINT:
    ' Z, }" u& H# Q  B
  113.       GUI_SetBkColor(GUI_BLACK);
    2 K/ X7 w; u5 t! N
  114.       GUI_Clear();  Y- \3 ?+ ]% [( p, F) l
  115.       GUI_SetColor(GUI_WHITE);
    ( a# t) k# l' P
  116.       GUI_SetFont(&GUI_Font24_ASCII);
    & T$ P" @. i) P3 f% D
  117.       GUI_DispStringHCenterAt("WIDGET_FrameWin - Sample", 160, 5);
    / t' j9 c* a; _8 o- ]3 s; k
  118.       GUI_SetFont(&GUI_Font8x16);, j% s4 F+ W8 f) k1 ]8 N
  119.       GUI_DispStringHCenterAt(_acMainText, 160, 40);
      l$ N" J3 _: r, e1 |1 Q
  120.       GUI_SetFont(&GUI_Font6x8);9 e( F* V) b2 O3 a1 `$ {. l- L0 d0 O5 o
  121.       GUI_DispStringHCenterAt("The function FRAMEWIN_Create creates both the\n"' `& `* k. y  f3 L) X( _1 B# [* R
  122. "frame window and the client window.", 160, 190);
    3 S/ s) Z4 U5 ~
  123.       break;& y7 G+ y; A+ P5 k" w
  124.     default:' d- \& s7 G6 M0 y
  125.       WM_DefaultProc(pMsg);
    1 X/ O5 G8 N4 v! G5 h
  126.   }
    1 s5 {4 d* @; K2 _
  127. }1 N' U/ w- G9 u: T$ r# U2 r( L

  128. 0 \3 C5 \5 R7 H
  129. /*******************************************************************  V& n( A* B, l6 ?; p
  130. *% O$ u7 B  V- v6 p
  131. *       _DemoFramewin5 Q. p6 l- b# B
  132. *; _; v9 E" z" W: }
  133. * Function description
    8 u/ {7 o  A/ A9 s; v/ R
  134. *   Creates the frame window and sets the callback for frame, child
    ( g  C9 u9 y# S
  135. *   and background window
    ) ]! r% t# J2 f# W. {" x. k1 ?3 ^
  136. */, g  f+ Q" Z9 `% \: j- F$ r2 Y
  137. static void _DemoFramewin(void) {(6)' M& ?4 W' D8 J' |/ K- t* }
  138.   int i;
    8 n4 n3 K2 x8 E
  139.   char acInfoText[] = "-- sec to play with window";
    6 e. a" C( I! k/ r: _5 J
  140.   WM_HWIN hChild;
    6 F0 X7 C' B3 `8 G+ Q: M7 C

  141. . J0 {, u" p  X1 G; U" J8 b" N

  142. 9 Y+ |0 R$ G: B1 E( V. a
  143.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
    * y4 [" g, {  t# w( E7 {; @
  144.   //
    ( s; x  ^1 [  ^! G6 D
  145.   // Create and configure frame window
    8 M0 M9 X8 p( k: {
  146.   //- K% p0 I' H* u+ ]
  147.   _ChangeMainText("FRAMEWIN_Create", SPEED);2 G5 o; G$ o8 A; m
  148.   _hFrame = FRAMEWIN_Create("Frame window", 0, WM_CF_SHOW, 50, 75, 220, 100);(7)3 f7 H* X8 P+ A2 D% e
  149.   _pcbOldFrame = WM_SetCallback(_hFrame, _cbFrame);(8)% E: @4 |  F1 K- j( m( ~) N
  150.   hChild = WM_GetClientWindow(_hFrame);(9)! a" P' e8 e; K
  151.   WM_SetCallback(hChild, _cbChild);(10)
    ' F6 @( {  S$ B$ T
  152.   FRAMEWIN_SetMoveable(_hFrame, 1);(11)
    " c# F$ m; c6 H9 s; H* F1 G; ]
  153.   //# s% v$ e4 }( F8 w* M
  154.   // Create buttons
    , e: D- G" e0 W& L) C7 F
  155.   //7 [) n, s0 t6 `; g0 R4 G" Q  y
  156.   FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);(12)
    1 h# H6 Z5 N( m. l$ D2 o) X
  157.   FRAMEWIN_AddMaxButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 0);/ Q* U8 @0 Y& E0 ~1 ], D
  158.   FRAMEWIN_AddMinButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 2);
    ; n& r* l) f# V6 |
  159.   //: i& _* A  R# i% l
  160.   // Modify frame window attributes' @3 A* K- M7 h* C. v  q
  161.   //
      F. Q( Q# P* B8 y# u. i% ~9 O8 e
  162.   _ChangeMainText("FRAMEWIN_SetActive", SPEED);
    0 B3 O, R+ c$ O! o2 [& Y  y
  163.   FRAMEWIN_SetActive(_hFrame, 1);(13)
    9 [  U+ q" ?7 I
  164.   _ChangeMainText("FRAMEWIN_SetFont", SPEED);
    3 ~0 t& `1 ^. |+ ~9 r* c. a
  165.   FRAMEWIN_SetFont(_hFrame, &GUI_Font16B_ASCII); (14)
    7 j9 i8 b0 Z5 x
  166.   FRAMEWIN_SetTitleHeight(_hFrame, 20);8 J+ P( V  c5 P
  167.   _ChangeMainText("FRAMEWIN_SetTextColor", SPEED);
    $ L. Q7 `2 V# x
  168.   FRAMEWIN_SetTextColor(_hFrame, GUI_YELLOW); (15)7 u! P3 C: O" s, T
  169.   _ChangeMainText("FRAMEWIN_SetTextAlign", SPEED);
    5 h7 k' T  J6 G+ ]9 ^  y- z2 l
  170.   FRAMEWIN_SetTextAlign(_hFrame, GUI_TA_HCENTER);(16)4 y  w( Q, [3 _& G' C7 g7 E' C0 a6 g
  171.   _ChangeMainText("FRAMEWIN_Minimize", SPEED);
    3 y5 p3 M/ d" P/ s3 n* p% x7 s( |
  172.   FRAMEWIN_Minimize(_hFrame);(17)4 z/ V. Y2 G7 ~- L, T: B8 b4 @3 I( }
  173.   _ChangeMainText("FRAMEWIN_Maximize", SPEED);# }. P  ^3 j' `) h, @) k
  174.   FRAMEWIN_Maximize(_hFrame);  (18)
    ' A& J, @1 h1 n# D4 V' ?* K; k
  175.   _ChangeMainText("FRAMEWIN_Restore", SPEED);
      Z) L/ ^6 K0 N
  176.   FRAMEWIN_Restore(_hFrame);(19)
    + Z  _& o, O; v7 Y- G  n
  177.   _ChangeMainText("FRAMEWIN_SetTitleVis", SPEED);  G) J2 q* a) x2 Y8 g" h
  178.   for (i = 0; i < 5; i++) {
    1 b9 {; b/ h4 F
  179.     FRAMEWIN_SetTitleVis(_hFrame, 0);  (20)3 _6 _, x- R( B1 L# C7 a. h) |4 A; J
  180.     GUI_Delay(200);
    - ^: \. u  Q7 k6 L
  181.     FRAMEWIN_SetTitleVis(_hFrame, 1);: m6 o1 j, E. @: T" z3 v# w
  182.     GUI_Delay(200);+ _, f) q( ]8 V+ Q+ I- n0 P0 l
  183.   }
    * r9 m8 X! o' s4 F) ^. E7 R% J1 h
  184.   //
    5 m# x) Z& v  z; J% S8 v
  185.   // Time to play with frame window/ L/ @2 {7 ]3 v, l" U
  186.   //" B7 I( r4 G! W( }0 p
  187.   _LockClose = 0;5 |/ h$ w5 F  f
  188.   for (i = 250; (i > 0) && _hFrame; i--) {
    7 s9 ^& p+ ?8 f$ o* ^
  189.     acInfoText[0] = '0' + ((i + 9) / 100);' w- G3 g, m2 S* f3 g0 A! S$ J0 B
  190.     acInfoText[1] = '0' + (((i + 9) / 10) % 10);
    / M4 m3 Y. x; w) v( [
  191.     _ChangeMainText(acInfoText, 0);  m- s8 F" T7 t0 n+ W
  192.     GUI_Delay(100);
    9 I+ {# b7 E. C( V, B6 P
  193.   }& A/ L' e) C! C( f0 n3 T
  194.   if (_hFrame) {
    5 O1 P$ w9 J) m& c9 `& G+ j8 Y
  195.     _ChangeMainText("FRAMEWIN_Delete", SPEED);
    ( m0 s. H' w9 B  o2 g' L
  196.     FRAMEWIN_Delete(_hFrame);(21)" _2 w; _9 \$ M$ ]8 T9 X" M
  197.   } else {
    3 A1 B3 [& t, z$ a( u6 B2 J: f
  198.     _ChangeMainText("", 50);* C" B/ B, B% V/ o/ r4 P2 k/ X# {
  199.   }- g- k, t% H$ }6 }3 p
  200. }. k8 J6 Y" w4 T6 B3 c5 p

  201. + n9 B" q+ G8 ]4 q9 Q) \
  202. /*********************************************************************2 b" M2 O" ]  ]
  203. *2 T/ u% }# O# e7 p7 R+ ^# g0 p
  204. *       Public code
    4 @8 y( t* w& ?" l9 e2 l, t
  205. *7 _) J$ q% T* F( B
  206. **********************************************************************; V' h; D" E# f, k* t/ {& g
  207. */6 p- P% w  ~3 [5 C/ t+ ]$ Q
  208. /*********************************************************************
    3 Y  ^" p3 _$ h- ], p: Z
  209. *
    7 F0 T% M6 A; a" M% B8 ^" _! X' Q
  210. *       MainTask" D# L( `7 ]' G/ a
  211. */
    9 r# s* f6 S" x* ]8 F6 G
  212. void MainTask(void) {
    6 x; Y# T5 q3 w- y
  213.   GUI_Init();% p" J7 v% h4 K% e0 `; q
  214.   WM_EnableMemdev(WM_HBKWIN); (22)
    " l% J4 k* Q4 j2 q4 o- ~6 J8 @
  215.   while(1) {! ?8 C" P0 R4 e: L
  216. _DemoFramewin();
    . q' Y$ }, q( Q+ C7 X
  217.   }
    3 h, D) B, e' A" b& w& s4 J+ S
  218. }
复制代码
1. 自定义的一个回调消息类型。
2. 用于给桌面窗口发送自定义的回调函数消息类型。发送后将桌面窗口变得无效,然后系统就会去执行桌面窗口回调函数中的WM_PAINT消息。
3. 框架窗口中客户窗口的回调函数。
4. 框架窗口的回调函数。
5. 桌面窗口的回调函数。
6. 框架窗口中部分API函数的演示函数。
7. 创建框架窗口。
8. 设置框架窗口的回调函数。
9. 得到框架窗口中客户端窗口句柄。
10. 设置客户端窗口的回调函数。
11. 设置框架窗口可移动。
12. 为框架窗口添加最小化,最大化和关闭按钮。
13. 激活框架窗口。
14. 设置框架窗口中标题的字体。
15. 设置框架窗口中标题的颜色。
16. 设置框架窗口中标题文本的对齐。
17. 最小化框架窗口。
18. 最大化框架窗口。
19. 恢复最小化或最大化的框架窗口。
20. 设置框架窗口的标题可见。
21. 删除框架窗口。
22. 使能桌面窗口的内存设备。
   这个例子中变量_LockClose的作用也很重要,它的主要作用就是在演示框架窗口时锁住关闭按钮,防止在演示的时候,用户点击了关闭按钮。大家也特别注意框架窗口回调函数_cbFrame的处理。
实际显示效果如下:
44.6.png
44.3 总结
    本期教程主要是跟大家讲解了框架窗口的使用,希望大家可以把本期教程中讲的这个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的框架窗口API,其它的API大家都可以试试。

( |2 G- i; [. @6 {
收藏 评论3 发布时间:2015-3-3 11:57

举报

3个回答
天使♀的☆宇★翼 回答时间:2015-3-4 10:26:10
学习学习,初学者看到这个感觉比较高深,确实挺感兴趣的
wyxy163@126.com 回答时间:2015-3-4 15:09:41
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-4 15:10:14
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版