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

【安富莱STemWin教程】第51章 MULTIPAGE-多页控件

[复制链接]
baiyongbin2009 发布时间:2015-3-10 11:27
本帖最后由 baiyongbin2009 于 2015-3-10 11:29 编辑
+ p! b# B) U, j( I! T$ `$ ]/ H* `" e. o4 `+ {8 |
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
5 N1 j4 X' |5 a, A, s2 f% z# w
第51章 MULTIPAGE-多页控件
+ x- F5 d- J7 R: T. ~1 X
    本期教程讲解STemWin支持的多页控件。
    51. 1 多页控件介绍
    51. 2 官方WIDGET_Multipage实例
    51. 3 使用GUIBulder建立多页控件
    51. 4 总结
51.1 多页控件介绍
    MULTIPAGE类似于笔记本中的分隔卡或文件柜中的标签。通过使用MULTIPAGE控件,应用程序可为窗口或对话框的相同区域定义多个页面。每个页面包含特定类型的信息或用户选择相应页面时应用程序会显示的一组控件。如果要选择一个页面,则必须单击该页面的选项卡。如果无法显示所有选项卡,则MULTIPAGE控件会自动在边缘处显示一个小滚动条以滚动页面。下表显示MULTIPAGE控件的外观:
51.1.png
MULTIPAGE控件的结构
    包含n个页面的MULTIPAGE小工具由n+2个
窗口组成:
  l 1个MULTIPAGE窗口
  l 1个客户端窗口
  l N个页面窗口
页面窗口将被添加到小工具的客户端窗口。右图显示了控件的结构。
51.2.png
51.1.1 多页支持的通知代码
    以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息
描述
WM_NOTIFICATION_CLICKED
已被点击。
WM_NOTIFICATION_RELEASED
已被释放。
WM_NOTIFICATION_MOVED_OUT
已被点击,且指针已移出控件,但没有释放。
WM_NOTIFICATION_VALUE_CHANGED
编辑小工具的值 (内容)已更改。
( E; v. ]( m. ?4 z$ K
51.1.2 多页支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反
按键
反应
GUI_KEY_PGUP
切换到下一页。
GUI_KEY_PGDOWN
切换到上一页。

7 W( L! `" O- p0 Q6 r7 ?1 g9 _
2 u* z2 |9 ~' o$ t2 ^' F3 F) E2 s
赞 收藏 评论10 发布时间:2015-3-10 11:27

举报

10个回答
baiyongbin2009 回答时间:2015-3-10 11:28:11
51.2 官方WIDGET_Multipage实例
官方的这个实例很好的演示了MULTIPAGE的使用,这个例子在模拟器中的位置:
‘ 51.3.png
源码如下(程序中进行了详细的注释):
  1. #include <stdlib.h>
    2 N% K2 q# @8 e8 \

  2. , J! N2 D: a4 }0 y' P& u
  3. #include "GUI.h"$ Y- A8 }4 n" q2 A$ K! B; t; z
  4. #include "MULTIPAGE.h"
    ! i* H* n% H  D4 g$ g
  5. 4 D: A2 n2 a2 t; B. c/ c
  6. /*********************************************************************6 ~' z- \6 e6 h- n% P9 |$ b  n
  7. *2 m2 o+ w' J- T4 U' T
  8. * Static data
    5 T' t$ b/ g7 C+ I5 D2 ]
  9. *- g% g9 d2 y) J( M8 ^
  10. **********************************************************************0 j6 \: y1 {% p7 h- K# I
  11. */
    + l0 B) K) A& E( |# ^
  12. /*********************************************************************
    * Z  m- o2 D, Y0 E4 ~
  13. *
    4 r! c7 O! C4 D( J. ^1 l
  14. * Dialog resource9 ~! ?7 x7 P/ q9 y6 T
  15. *5 \, S6 U! A# }1 m; d
  16. * These tables contain the information required to create the dialogs.
    " _* \# |0 O: b9 P
  17. * It has been created manually, but could also be created by the GUIBuilder.. M, U& \0 A% \
  18. */7 |) {3 o5 y, J0 b
  19. static const GUI_WIDGET_CREATE_INFO _aDialogCreate1[] = {
    * t8 j6 V5 ~9 Y$ G5 H
  20. { WINDOW_CreateIndirect, "Dialog 1", 0, 0, 0, 260, 100, FRAMEWIN_CF_MOVEABLE },4 e: O8 ?: V+ q8 e
  21. { BUTTON_CreateIndirect, "Button", GUI_ID_BUTTON0, 5, 30, 80, 20, 0},
      O$ M: c$ P! t( m* w
  22. { TEXT_CreateIndirect, "Dialog 1", 0, 5, 10, 50, 20, TEXT_CF_LEFT }
    6 p" w0 _2 @* O9 J2 S- k: ?
  23. };
    : v$ _; h8 o% E, R) E. P: I/ J

  24. % x+ h) C' U5 i! h1 E) e5 u5 p
  25. static const GUI_WIDGET_CREATE_INFO _aDialogCreate2[] = {
    ! N9 s# g( L& H( O, `2 O7 G7 M
  26. { WINDOW_CreateIndirect, "Dialog 2", 0, 0, 0, 260, 100, FRAMEWIN_CF_MOVEABLE },# b( _3 _! D' Y. z7 z( r( i
  27. { CHECKBOX_CreateIndirect, "", GUI_ID_CHECK0, 5, 30, 0, 0, 0},4 n; ~+ U% O7 _- f% M" ^
  28. { CHECKBOX_CreateIndirect, "", GUI_ID_CHECK1, 5, 50, 0, 0, 0},
    , D9 [" R9 @/ t% v# {
  29. { TEXT_CreateIndirect, "Select 0", GUI_ID_TEXT0, 25, 30, 50, 15, TEXT_CF_LEFT },2 a+ q$ J2 F. W/ t$ v
  30. { TEXT_CreateIndirect, "Select 1", GUI_ID_TEXT1, 25, 50, 50, 15, TEXT_CF_LEFT },! ?. q' J9 C8 S7 R
  31. { TEXT_CreateIndirect, "Dialog 2", 0, 5, 10, 50, 20, TEXT_CF_LEFT }' J' u; N& N& j) e* |, u/ H
  32. };9 m6 c- O  ?- A/ j. p
  33. 8 m1 d9 f7 ]' b- r# w$ k* c
  34. static const GUI_WIDGET_CREATE_INFO _aDialogCreate3[] = {- H2 o8 W; C2 r3 H. S  e5 M
  35. { WINDOW_CreateIndirect, "Dialog 3", 0, 0, 0, 260, 100, FRAMEWIN_CF_MOVEABLE },9 J0 W: c; Q9 r" l' a4 Z* h
  36. { RADIO_CreateIndirect, "", GUI_ID_RADIO0, 5, 30, 0, 0, 0, 3},  `7 e7 \0 ]/ w' w& L+ L2 W9 n- i
  37. { TEXT_CreateIndirect, "Option 1", GUI_ID_TEXT0, 25, 30, 50, 15, TEXT_CF_LEFT },* a, E- E0 Q8 R1 O% }0 t* p7 a
  38. { TEXT_CreateIndirect, "Option 2", GUI_ID_TEXT1, 25, 50, 50, 15, TEXT_CF_LEFT },
    ; _/ f) L( S; D
  39. { TEXT_CreateIndirect, "Option 3", GUI_ID_TEXT2, 25, 70, 50, 15, TEXT_CF_LEFT },( O3 J) @2 j  ]: o- w" e
  40. { TEXT_CreateIndirect, "Dialog 3", 0, 5, 10, 50, 20, TEXT_CF_LEFT }
    ; G5 W4 J2 I2 v5 j4 B/ \  e! h
  41. };9 r3 k9 I* [5 Z6 n( h
  42. 1 o6 W" Z" V" o  I- F1 P9 A
  43. static const GUI_WIDGET_CREATE_INFO _aDialogCreate4[] = {2 S. U+ L4 R* n  f( e5 m5 c
  44. { WINDOW_CreateIndirect, "Dialog 4", 0, 0, 0, 260, 100, FRAMEWIN_CF_MOVEABLE },
    ! s/ z9 W) g( \7 o- ^& V; v
  45. { MULTIEDIT_CreateIndirect, "Text", GUI_ID_MULTIEDIT0, 5, 30, 200, 40 },
    1 T* g, B5 s' h
  46. { TEXT_CreateIndirect, "Dialog 4", 0, 5, 10, 50, 20, TEXT_CF_LEFT }, H# E1 g; p) o! _0 T/ B, F  H+ y
  47. };
    : |: q3 b3 k% u* b- J

  48. 1 b* d2 a* w- Q1 Z# a" \5 c/ M
  49. static const GUI_WIDGET_CREATE_INFO _aDialogCreate5[] = {
    ) ]/ ]5 m' S/ b  e4 b7 [$ ~1 G
  50. { WINDOW_CreateIndirect, "Dialog 5", 0, 0, 0, 260, 100, FRAMEWIN_CF_MOVEABLE },9 j  F6 C; ?4 _$ M! x+ H& P5 ?! B) C
  51. { SLIDER_CreateIndirect, "", GUI_ID_SLIDER0, 5, 30, 200, 40 },
    2 j% J, e% V% `; c
  52. { TEXT_CreateIndirect, "Dialog 5", 0, 5, 10, 50, 20, TEXT_CF_LEFT }
    / J8 n* V9 S& q& I7 G8 T
  53. };
    8 j; h& Q$ D& e) D4 r! `

  54. % B$ R& [2 d6 J, k( C  J# N% w
  55. static const GUI_WIDGET_CREATE_INFO _aDialogCreate6[] = {
    5 C4 H" z9 b* e1 X% f7 C
  56. { WINDOW_CreateIndirect, "Dialog 6", 0, 0, 0, 260, 100, FRAMEWIN_CF_MOVEABLE },- Q8 n" S' O4 h1 U0 q
  57. { SCROLLBAR_CreateIndirect, "", GUI_ID_SCROLLBAR0, 5, 30, 200, 40 },% [  T, w" @. L3 c
  58. { TEXT_CreateIndirect, "Dialog 6", 0, 5, 10, 50, 20, TEXT_CF_LEFT }
    ( S7 A' B& @. C% o& E9 s, [
  59. };
    0 m; [( H% m! B5 D& J5 I( B) j, H
  60. 3 W% [7 S- \: x8 V& m; L2 N; `
  61. /*********************************************************************
    3 D4 P; _+ N) U% ^9 }
  62. *
    : k" R5 V* T( A8 V9 G# N
  63. * Static code2 ^# N: T& K8 O! u7 o, j
  64. *
    % d% g/ A. ~" D" f% Z* v2 I
  65. **********************************************************************. P  Y+ S1 {$ p- M
  66. */# I8 Q9 _  E  O" o; K
  67. /*********************************************************************2 B) U. ^3 O: _& M
  68. *
    0 X* R/ k% P: ~* J# d  _  v
  69. * _cbDialog4
    3 h- f2 X) o; n" J: K- x
  70. *// y6 Q. |# ]- H! T) Q5 f
  71. static void _cbDialog4(WM_MESSAGE * pMsg) {
    6 H4 u4 N! s7 b4 l8 j3 F
  72. WM_HWIN hItem;% n0 r" Z% Q/ g+ w$ w6 C
  73. WM_HWIN hDlg;+ z0 a/ V3 Q0 }. ^+ h# x& C
  74. 3 j2 Z& B8 F1 Z, g( Q
  75. hDlg = pMsg->hWin;
    9 e4 V) c4 `! _- b2 {. d
  76. switch (pMsg->MsgId) {
    3 Q/ C0 w3 p) ^/ y, B/ V# v
  77. case WM_INIT_DIALOG:
    ( w: Q6 q- H# L: u# `5 n6 j  M  Z
  78. hItem = WM_GetDialogItem(hDlg, GUI_ID_MULTIEDIT0);
    # f* A7 r+ T; \# ]& Y# m
  79. MULTIEDIT_SetText(hItem, "MULTIEDIT widget");% q' |1 d  _6 E! w! |6 T1 }
  80. MULTIEDIT_SetInsertMode(hItem, 1);
    * w7 b; s* p, q
  81. break;! Z! x, h5 v. |! W
  82. default:
    " r6 k. j9 C$ f2 G0 r6 v& G: c* p
  83. WM_DefaultProc(pMsg);* A) d8 _3 y9 z9 Y1 z1 h- _
  84. }4 e  Q3 Q! i* l: d0 F& Y
  85. }
    8 {* Y  r! _2 i" ~

  86. & i* v' {9 E3 ~! I
  87. /*********************************************************************
    8 `0 ], s( H- a* }4 R) h
  88. *
    & O0 c4 U' c* h
  89. * _cbBkWindow
    $ v/ D, V& w0 y( F- ^& M
  90. *
    6 s! c, E4 @3 I: O2 T) A5 M
  91. * 桌面窗口的回调函数,主要是重绘部分
    $ |8 V7 K' U- k: l2 S
  92. */, M, g# ]2 L8 O
  93. static void _cbBkWindow(WM_MESSAGE * pMsg) {
    $ J; J( S" d& K7 G3 h( s6 M# ?
  94. switch (pMsg->MsgId) {
    # P4 l' |# ~% u, W! ^5 f/ ^4 n
  95. case WM_PAINT:  k* N' S. Q6 w$ G0 H* l3 p
  96. GUI_SetBkColor(GUI_BLUE);1 Q5 l0 k! Z% L! I. O3 G& ]
  97. GUI_Clear();
    $ x: K$ V* m4 e& ~
  98. GUI_SetColor(GUI_WHITE);
    $ Q$ L: I" w; _, s0 S( o+ |
  99. GUI_SetFont(&GUI_Font24_ASCII);
    % g( Z9 I: {3 z9 q
  100. GUI_DispStringHCenterAt("WIDGET_Multipage - Sample", 160, 5);
    % T7 w, b3 G$ C
  101. break;9 r% `' ?9 z* H4 T2 B) B
  102. default:" L7 c# D, c2 m: ?1 x$ H
  103. WM_DefaultProc(pMsg);
    # }+ `6 l, @9 r( [" @$ A; A
  104. }
    ' u4 I% B, s/ `  l! D" M
  105. }% x  q8 R- o3 z# A0 D" T2 f0 g
  106. * M1 p; G% s- k2 X7 G
  107. /*********************************************************************
    , A8 o8 [3 M; E' I7 P' _( z$ n' l8 m: E
  108. *
    8 v7 O! l4 a0 E3 L6 s
  109. * Public code. W/ Y% }0 D: m& K8 i9 O( F2 U
  110. *
    6 L; H; J! c! r5 L, [7 ~
  111. **********************************************************************$ q! I( K. w# k# O3 ?0 n$ \. u& E
  112. */7 O1 `5 e0 s# q% g9 z5 B% v( J& Y1 Z/ r
  113. /*********************************************************************
    ) S5 \  D' d# V7 W# e
  114. *
    4 n, f$ Z$ w& ?5 k
  115. * MainTask" [" N8 y9 @& w5 f- C6 d
  116. */! M- g8 Z* |8 `" X, N$ C
  117. void MainTask(void) {
    6 K$ M+ T/ Y( M* Q
  118. WM_HWIN hMultiPage;
    ( Z/ k* r; P+ p, W
  119. WM_HWIN hFrameWin;
    $ l1 O9 W6 g- `: C
  120. WM_HWIN hDialog;. n( [% @& }0 ]$ _- _

  121. ' O) [7 T+ ^2 y- X) h3 G2 @% F
  122. //
    ! k! Z3 D; I1 a1 |/ K7 {5 [4 N
  123. // 使能窗口使用内存设备
    & {. F' O( f+ }
  124. //
    6 }$ G" u( M3 A! }$ q% w
  125. WM_SetCreateFlags(WM_CF_MEMDEV);! n5 t. Z2 r7 r- H$ W! l
  126. GUI_Init();! s  a- ~0 Y3 U
  127. /* 设置桌面窗口的回调函数 */
    6 @( Q1 M% N2 @  X% S' f  |
  128. WM_SetCallback(WM_HBKWIN, _cbBkWindow);
    3 Z. J1 ?6 ]4 e. _

  129. 7 |; K' G* A) z
  130. //& \# {) U0 F; n1 A3 N6 R
  131. // 创建框架窗口. ]1 P( K* G% D- S
  132. //
    ! N9 v7 o3 i9 @. x9 H
  133. hFrameWin = FRAMEWIN_Create("FrameWindow", NULL, WM_CF_SHOW, 40, 44, 240, 152);: R1 x6 m9 O7 m; G
  134. /* 设置窗口的属性 */$ U* X% z4 v2 X1 E3 ^- w
  135. FRAMEWIN_SetClientColor(hFrameWin, GUI_GREEN);: h( E. W& b5 X1 Y6 W2 [2 X, \& S
  136. FRAMEWIN_SetActive(hFrameWin, 1);
    9 |$ s5 ]( y5 k9 B: |2 x3 f
  137. FRAMEWIN_SetMoveable(hFrameWin, 1);
    9 J+ v& ^, J* T4 O6 Q! \! k8 \# U

  138. 3 E, J2 x7 Q3 Z4 {9 ~* d  _7 N( x- c0 T
  139. //
    5 A* @. e6 Y+ j5 [+ X
  140. // 在框架窗口上创建多页控件
      {6 |$ V9 b9 n  X  i8 q7 C% w& j
  141. //6 a3 H: w) }# h8 U8 k
  142. hMultiPage = MULTIPAGE_CreateEx(7, 6, 220, 120, WM_GetClientWindow(hFrameWin), WM_CF_SHOW, 0, 0);
    $ q6 I. v# F. K1 y4 y( c" N$ M8 `
  143. GUI_Delay(500);
    2 S4 |- {$ |  q, H1 W
  144. 6 E) @+ b3 B0 q: J9 c
  145. //5 ]3 u" j+ K% C
  146. // 在多页控件的每页上面创建对话框,创建了对话框后,要通过函数MULTIPAGE_AddPage进行添加。
    / q: c, }: s6 t4 h" r$ O
  147. //0 I4 e: o7 `! k( R
  148. hDialog = GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1), NULL, WM_UNATTACHED, 0, 0);
    ' E0 A. w( r+ g7 q2 `6 v5 S" s
  149. MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 1");* U, R! x/ Y+ |& h+ p% b
  150. GUI_Delay(500);6 x/ i9 {( Z4 z# h* y4 T
  151. hDialog = GUI_CreateDialogBox(_aDialogCreate2, GUI_COUNTOF(_aDialogCreate2), NULL, WM_UNATTACHED, 0, 0);
    : V9 D* v2 t  h3 U: L9 f4 m) v
  152. MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 2");9 [# [+ K  j6 r
  153. GUI_Delay(500);
    : r: {" G; \) V# p
  154. hDialog = GUI_CreateDialogBox(_aDialogCreate3, GUI_COUNTOF(_aDialogCreate3), NULL, WM_UNATTACHED, 0, 0);$ @2 w' |5 H- v4 J+ E
  155. MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 3");" P7 J9 R' t1 F' w$ u
  156. GUI_Delay(500);
    * Q; ]4 T7 w2 i/ O) _
  157. hDialog = GUI_CreateDialogBox(_aDialogCreate4, GUI_COUNTOF(_aDialogCreate4), _cbDialog4, WM_UNATTACHED, 0, 0);
    # ?( M9 l% A) a
  158. MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 4");" H0 o; R$ l7 v+ ~6 F1 u
  159. GUI_Delay(500);
    6 Y- F, |. u% Z: e- K* A% B
  160. hDialog = GUI_CreateDialogBox(_aDialogCreate5, GUI_COUNTOF(_aDialogCreate5), NULL, WM_UNATTACHED, 0, 0);
    . W- {* u1 E2 }7 U4 e
  161. MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 5");
    & v" ]6 b  ?  u& N
  162. GUI_Delay(500);4 U2 W% K8 h! o6 \
  163. hDialog = GUI_CreateDialogBox(_aDialogCreate6, GUI_COUNTOF(_aDialogCreate6), NULL, WM_UNATTACHED, 0, 0);
    7 ^( h$ {- S1 f
  164. MULTIPAGE_AddPage(hMultiPage, hDialog, "Page 6");3 F4 ~1 s, W9 X* h+ e' m: {
  165. GUI_Delay(500);% a  P0 b% ~3 ?
  166. //3 |5 _2 M) O# [, a# a  O
  167. // 通过函数MULTIPAGE_SetAlign设置对齐
    4 ~) O8 t  }" U
  168. //. S+ `- X  h( ?! Y
  169. MULTIPAGE_SetAlign(hMultiPage, MULTIPAGE_ALIGN_RIGHT);+ n: l) ]5 k* W8 m
  170. GUI_Delay(500);
    # u" G9 f$ Z  V$ ?/ X3 n3 v6 h
  171. MULTIPAGE_SetAlign(hMultiPage, MULTIPAGE_ALIGN_RIGHT | MULTIPAGE_ALIGN_BOTTOM);
    ; O5 X3 i/ @0 [% b
  172. GUI_Delay(500);3 h: X$ c0 Z: H& N8 L& _& V9 x
  173. MULTIPAGE_SetAlign(hMultiPage, MULTIPAGE_ALIGN_LEFT | MULTIPAGE_ALIGN_BOTTOM);  u6 D$ p& L2 i3 y
  174. while (1) {6 E9 N# |, c& W6 K. I, r( w% v9 l6 {
  175. GUI_Delay(100);) G6 }' ~+ r7 k* W4 T" l
  176. }( F- Q2 i6 K/ i$ T4 S7 Z1 k* b
  177. }
复制代码
这个例子给出了多页控件的基本使用方法,如果想使用多页控件的话,这个例子很有参考价值。实际显示效果如下:
51.4.png

" M% |0 K5 n. w

3 z0 F1 D7 B  f, m( O* ?" G: c
baiyongbin2009 回答时间:2015-3-10 11:28:48
51.3 使用官方GUIBulder建立多页控件
   这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
51.5.png
    多页控件中选项的添加也比较容易,在多页控件上右击鼠标,可以看到如下界面:
51.6.png
    添加后具体每个多页控件选项的名字左下角这里进行设置:
51.7.png
    设置好以后,将生成的代码复制到模拟器或者开发板上面并稍作修改(生成的代码在本期教程配套的例子中),显示效果如下:
51.8.png
51.4 总结
    本期教程主要是跟大家讲解了多页控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的多页控件API,其它的API大家都可以试试。

: C7 w7 J/ ^% s1 W% E; R( J
拼命三郎 回答时间:2015-3-10 11:43:09
hdx.jpg
hehe212121 回答时间:2015-3-10 13:19:08
好东西 顶顶顶
wu1169668869 回答时间:2015-3-10 13:20:01
看成安富利了。。
wyxy163@126.com 回答时间:2015-3-10 15:45:00
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-10 15:45:40
提示: 作者被禁止或删除 内容自动屏蔽
一木320 回答时间:2015-7-27 12:08:47
感觉安富莱好强大
stary666 回答时间:2015-7-27 12:15:37
学习一下,
逆风的沙 回答时间:2015-7-31 11:17:05
正在学习中 。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版