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

【安富莱STemWin教程】第58章 SPINBOX控件

[复制链接]
baiyongbin2009 发布时间:2015-3-14 11:34
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
5 X; w, c* S' M  D, P
第58章 SPINBOX控件

* P4 o; u, p  r8 c
    本期教程讲解STemWin支持的SPINBOX控件。
    58. 1 SPINBOX控件介绍
    58. 2 官方WIDGET_Spinbox实例
    58. 3 使用官方GUIBulder建立SPINBOX控件
    58. 3 总结

* P7 o( ~7 K7 H% C( O58.1 SPINBOX控件介绍
    SPINBOX控件主要用于需要快速而准确的数据调整,SPINBOX控件是由一个编辑框和两个按钮组成。默认的显示效果如下:
58.1.png
设置了皮肤色后显示效果如下:
58.2.png
58.1.1 SPINBOX支持的通知代码
    以下事件是编辑框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:

" ~3 c( h7 B9 C2 o! F$ p- E7 G
消息
描述
WM_NOTIFICATION_CLICKED
已被点击。
WM_NOTIFICATION_RELEASED
已被释放。
WM_NOTIFICATION_MOVED_OUT
已被点击,且指针已移出控件,但没有释放。
WM_NOTIFICATION_VALUE_CHANGED
SPINBOX的值 (内容)已更改。
58.1.2 SPINBOX支持的键盘反应
    同第43章中的43.1.2小节一样。
58.2 官方WIDGET_Spinbox实例
    官方的这个实例很好的演示了spinbox的使用,这个例子在模拟器中的位置:
58.3.png
源码如下(程序中进行了详细的注释):
  1. #include "GUI.h"# o! r( p( i6 V% F
  2. #include "DIALOG.h"
    - O  e. }: Y9 p; ?

  3. / z4 m8 q4 l! V; Y- n! D. O% E" G
  4. /********************************************************************** `" f5 m% h& ?
  5. *
    5 N* T( n* f! g5 ], @2 m
  6. *       Static data
    + B# i& b7 M' w+ S+ s* a/ U
  7. *# r: F8 m2 g& D* N
  8. **********************************************************************7 @" ?% H. J! }7 F
  9. */, D7 m% ^. j, o& |4 o* b5 C4 @# c
  10. static const GUI_WIDGET_CREATE_INFO _aDialogSpinbox[] = {! x  W1 p$ @9 B# q4 F* y
  11.   { FRAMEWIN_CreateIndirect, "Spinbox",           0,                 0,  0, 260, 160, 0, 0, 0 },
    ( W5 e8 w1 x2 N9 n. i$ K8 a
  12.   { TEXT_CreateIndirect,     "Step value",        GUI_ID_TEXT0,     20, 15, 100,  21, 0, 0, 0 },/ F& A+ m+ S/ e( e  A
  13.   { TEXT_CreateIndirect,     "Editmode "Step"", GUI_ID_TEXT1,     20, 42, 100,  21, 0, 0, 0 },, u9 o) y/ Q1 V  m/ ?$ U$ j! j
  14.   { TEXT_CreateIndirect,     "Editmode "Edit"", GUI_ID_TEXT2,     20, 75, 100,  21, 0, 0, 0 },
    9 T! r+ [! l' \3 m
  15.   { SPINBOX_CreateIndirect,  NULL,                GUI_ID_SPINBOX0, 130, 15,  60,  21, 0, 0, 0 },
    3 w  }$ {9 s2 [  \
  16.   { SPINBOX_CreateIndirect,  NULL,                GUI_ID_SPINBOX1, 130, 42,  60,  21, 0, 0, 0 }," ]$ h. M+ l2 b9 o) K
  17.   { SPINBOX_CreateIndirect,  NULL,                GUI_ID_SPINBOX2, 130, 75,  60,  21, 0, 0, 0 },
    $ g  A0 J) r* H2 Y* x, S5 i
  18. };: I/ H$ ~" f, ]$ E
  19. 2 T/ a/ n% W6 i
  20. /*********************************************************************
    7 a- @% \2 G/ j. e5 o( _$ e
  21. *8 U" g: _" f' |2 S; r0 E' Q
  22. *       _cbBk9 c* {( k1 k& @/ x  L0 F  N& Y
  23. *   桌面窗口的回调函数2 l& x$ k3 q. E6 q
  24. */
    1 b4 V; f! d! ]2 ^
  25. static void _cbBk(WM_MESSAGE * pMsg) {
    , W+ t( {: m/ ?# b* X
  26.   int xSize;
    % J8 i2 U& A4 Q! c/ V
  27.   int ySize;' [$ }, D9 E8 I* X

  28. : q, n- f! H% V: ?; _, F: e9 X4 B
  29.   switch (pMsg->MsgId) {
    : T7 u! p; h  s9 T5 W( o+ z
  30.   case WM_PAINT:- C  U' i( q8 W9 ^
  31.     xSize = LCD_GetXSize();0 H: P, B. b3 U  W7 @
  32.     ySize = LCD_GetYSize();/ o8 X" ]" u- q2 a1 x
  33.     GUI_DrawGradientV(0, 0, xSize, ySize, GUI_BLUE, GUI_BLACK);
    $ k" Y" u9 r5 n
  34.     GUI_SetColor(GUI_WHITE);
    % x1 o0 f2 W4 B' [" l. S- G$ c
  35.     GUI_SetFont(&GUI_Font24_ASCII);4 W5 e7 F6 }. E# N5 O
  36.     GUI_SetTextMode(GUI_TM_TRANS);; C* B8 w4 e- ]' ]0 P
  37.     GUI_DispStringHCenterAt("WIDGET_Spinbox - Sample", xSize / 2, 5);
    0 T$ B: H, D1 Y7 r& ~' C
  38.     break;
    9 |* S. Q2 q1 i% D' t
  39.   default:
    - a. E8 q3 d* Y6 r
  40.     WM_DefaultProc(pMsg);- @: ~  o- ]; f( q  z9 `7 V, [  _
  41.   }5 Y, \+ g0 [& n* W4 S& L! f
  42. }
    / C5 I/ C& Q* b& P# V
  43. , L' W1 y; V! n) a! a: q1 o# `
  44. /*********************************************************************2 `5 ?7 X: y0 r( d! E$ l7 E: T
  45. *% o' ?6 w: M1 N# M* b& E/ D
  46. *       _cbClient
    ' }2 p8 O; D8 ~8 @# o+ ^! O
  47. *   对话框的回调函数- {8 c! Y) R2 ~5 ^2 {: @1 r, m
  48. */
    2 p2 B6 {. V( t& w; |7 j0 a
  49. static void _cbClient(WM_MESSAGE * pMsg) {
    " ^# d; N& p' k0 R2 k* T/ s1 G2 ^
  50.   EDIT_Handle hEdit;. E- P+ n1 e- f1 L% h
  51.   WM_HWIN     hItem;' ~; ~! L. |  g' V, O- _0 ?: D
  52.   int         Value;2 h: E) p! p! |4 T" f( D2 Y$ J
  53.   int         NCode;" S1 Z8 g. i2 T* N9 A
  54.   int         Id;
    / I% o, Q' s* v& X+ A) S

  55. ' z$ [$ Q- `6 s9 G& y) H
  56.   switch (pMsg->MsgId) {
    ; X% v) A1 O* @
  57.   case WM_INIT_DIALOG:' Z: L: {1 c4 F

  58. 0 [) ?! ~  m1 C9 H6 ^
  59.     /* 设置框架窗口标题的字体和皮肤 */$ j: Z3 j# O8 v
  60. FRAMEWIN_SetFont(pMsg->hWin, GUI_FONT_16B_ASCII);% t& i& P3 H3 ?0 {
  61.     FRAMEWIN_SetSkin(pMsg->hWin, FRAMEWIN_SKIN_FLEX);
    7 c2 X/ R% J' t) }

  62. / e3 F5 Y8 c. |( J8 F7 t
  63.     /* 设置文本TEXT0的对齐方式 */* n% t2 B% H6 G. p; o3 `
  64. hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT0);
    + g) w/ y4 B5 K7 F' [9 S
  65.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);! O) J( [: }9 O7 T$ O  Q
  66. /* 设置文本TEXT1的对齐方式 */
    ( Y  L6 Q. D5 a
  67.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT1);$ L* ^* m0 z, l+ R7 y6 j
  68.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);
    3 j. n1 j7 h3 V$ S  ]
  69. /* 设置文本TEXT2的对齐方式 */% w7 @( u) s# a: X1 G) Q* A. U- k
  70.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_TEXT2);$ A) @) s' M; }& P/ u. x
  71.     TEXT_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_RIGHT);$ }* @, o3 }6 c5 }

  72. : I0 H$ q  C# e2 _0 c' u/ ^. [. P, _- K
  73.     /* 设置spinbox的皮肤 */
    5 |9 T9 w) z# B$ b. I! H
  74. hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX0);
    * A, {8 O4 P3 I; R
  75.     SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
    ) f8 k( u1 e( x; e3 K7 g, Z
  76.     hEdit = SPINBOX_GetEditHandle(hItem);
    " l/ y) l( a; S5 R
  77.     /* 启用编辑字段的十进制编辑模式 */
    2 r6 `) S+ G9 X$ C
  78. EDIT_SetDecMode(hEdit, " F  A. b, H7 U. }% }
  79.                 1,    /* 要修改的值 */
    8 w& R/ N: A# ^; L& W0 [
  80. 1,    /* 最小值 */$ P3 ]# X) s8 a0 b" c0 ?
  81. 10,   /* 最大值 */
    : a3 @) `: Q. Y0 i& Y% s
  82. 0,    /* 如果>0,指定小数点的位置 */
    7 X! l) f  |* b0 A, H7 y) d
  83. 0);   /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */- o" Q: o. G; b% [
  84. , @; U8 o/ _2 F4 P5 s
  85.      /* 设置spinbox的皮肤 */* E$ v4 x" Z: s' R* O
  86. hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);
    " D3 G3 q1 p$ @$ `
  87.     SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);
    : ]  H, f0 \; B
  88.     hEdit = SPINBOX_GetEditHandle(hItem);
    ! Q& [! _# p) g8 K* Y( ?
  89.     /* 启用编辑字段的十进制编辑模式 */
    ' ?/ E& L& x- T0 ^; s4 g
  90. EDIT_SetDecMode(hEdit, 2 m7 w2 g# g! y) d- u
  91.                 1,     /* 要修改的值 */& R; w- N6 X) _) m. L4 X
  92. 0,     /* 最小值 */0 X8 ?3 J; B/ H6 W: t7 {
  93. 99999, /* 最大值 */" N' z: a% C) c- M+ h& F0 m
  94. 0,     /* 如果>0,指定小数点的位置 */- K. g. p2 p( H) Z9 z+ Z% d* t
  95. 0);    /* 0(默认值):在正常模式下编辑,符号仅在Value为负值时显示 */5 t4 v9 I& }2 U8 J* }
  96.      /* 设置spinbox的皮肤 */
    1 K( A! U( z0 Q8 U
  97. hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX2);
    / l1 `" ^! S  l
  98.     SPINBOX_SetSkin(hItem, SPINBOX_SKIN_FLEX);- J- F# ~4 D1 J' V5 K4 n  \, s7 b) |
  99. 2 L" O$ t, C# l5 ]! {; _
  100. /* 特别注意,这个函数是5.24版本才加入的,用于设置模式 */2 m6 g% l+ V$ M( Q/ [- f2 T
  101. SPINBOX_SetEditMode(hItem, SPINBOX_EM_EDIT);0 t. _8 J! F( `! k' ~& t
  102. /* 设置最大和最小值 */
    ! W& G, u- G* ?9 T# A
  103.     SPINBOX_SetRange(hItem, 0, 99999);3 @" V( m/ V, i, g5 T
  104.     break;% h' B2 D' a( B" g
  105.   case WM_NOTIFY_PARENT:: ]7 B1 ^$ j0 E9 A7 M
  106.     NCode = pMsg->Data.v;% a2 X4 j: r# t2 Y5 N- B; f
  107.     switch (NCode) {
    " j4 q, l9 r: b' a1 K9 g9 N6 N1 S
  108. /* 接收到GUI_ID_SPINBOX0的WM_NOTIFICATION_VALUE_CHANGED消息后,根据SPINBOX0
    9 i8 [  F, b' i3 [# Y
  109.    中的当前值修改SPINBOX1中单次的前进后退步数。
    2 N  f* ^( B3 d5 A$ b3 m
  110. */$ U" z/ P9 r1 ]
  111.     case WM_NOTIFICATION_VALUE_CHANGED:+ z4 ]3 q. ?5 B, Q8 D( H$ N  @
  112.       Id = WM_GetId(pMsg->hWinSrc);
    ! [6 y9 A! \- W" p2 t2 f9 h9 h
  113.       if (Id == GUI_ID_SPINBOX0) {
    ' J9 n) Q! Y& R# H3 w
  114.         Value = SPINBOX_GetValue(pMsg->hWinSrc);# a! h* X& J; E. `% _) E4 ?
  115.         hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_SPINBOX1);; g; E4 v: b8 q5 F
  116.         SPINBOX_SetStep(hItem, Value);
    ; i5 _, x: c3 K9 P  {
  117.       }: o4 A- U7 ?$ e. C$ U. z2 {( w/ ~; I
  118.       break;
    4 B0 _( u' T. B( g) P' `
  119.     default:# ?; Z7 a2 p% o; x$ m
  120.       WM_DefaultProc(pMsg);. J! x2 u6 d* v5 k
  121.     }: ^+ O0 s! g7 E% ^! _
  122.     break;
    9 x) n$ N' a6 r3 ]: o0 X# g4 s
  123.   case WM_PAINT:
    " p' o' N( l" k7 V$ N6 b' {
  124.     GUI_SetBkColor(0xAE9E8D);
    ) @6 R6 x. j3 ?8 {/ f
  125.     GUI_Clear();+ d: z1 C, p% C4 H
  126.     break;
    1 v; `+ {! D/ v1 Y& A7 i# ]
  127.   default:
    $ V$ d9 P( E8 a  q0 }
  128.     WM_DefaultProc(pMsg);% [1 q6 Z( |* |$ O2 L
  129.   }' J! P% d$ C' e0 n
  130. }! s5 C7 Z7 F+ A: p2 a( ?. n" ^
  131. ( U) F- T7 D1 r/ a: @
  132. /*********************************************************************7 M' U" |, A- |; z4 c. D4 x
  133. *
    7 |/ h4 j. J8 C8 m6 |
  134. *       MainTask
    5 X4 c1 \# s4 b# @% g2 ~
  135. */
    : `7 U6 G6 @" V) @7 i$ {' o
  136. void MainTask(void) {
    3 l( j% t; q2 v; T- X+ k5 \
  137.   GUI_Init();3 R' ]$ ?, n2 B1 k; P8 S
  138.   WM_SetCallback(WM_HBKWIN, _cbBk);
    ; ~4 }3 y0 N- n6 N4 P! ?
  139.   TEXT_SetDefaultTextColor(GUI_WHITE);8 _" n6 G7 q8 O, K; Y, q
  140.   /* 创建对话框 */
    3 K1 ?0 T: [- |" x7 k
  141.   GUI_CreateDialogBox(_aDialogSpinbox, GUI_COUNTOF(_aDialogSpinbox), _cbClient,  WM_HBKWIN,  30,  60);0 F! L: d; v  |2 L. |- a4 `
  142.   while (1) {$ \4 T3 H' z: u  J
  143.     GUI_Delay(100);
    2 z# t0 G  Y% q( Y, R. X
  144.   }/ ^% Y$ o( N$ s7 i
  145. }
复制代码
实际显示效果如下:
58.4.png
58.3 使用官方GUIBulder建立SPINBOX控件
    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
58.5.png
    当前GUIBulder5.22版本对SPINBOX控件的支持还比较的弱,仅支持将其添加到对话框上面。将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):
58.6.png
58.4 总结
    本期教程主要是跟大家讲解了SPINBOX控件的基础使用方法。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的SPINBOX控件API,其它的API大家都可以试试。

7 ~" i1 b: S+ K. B" M/ W! C" j
赞 收藏 评论11 发布时间:2015-3-14 11:34

举报

11个回答
kqh1120 回答时间:2015-3-14 11:35:19
谢谢分享 14.gif
大浪10010 回答时间:2015-3-14 13:12:14
学习了,,,,
大浪10010 回答时间:2015-3-14 13:12:40
支持一下,,,
wu1169668869 回答时间:2015-3-14 13:24:17
谢谢分享~
wu1169668869 回答时间:2015-3-14 13:24:36
还有这每天都更新也是难得。。
wyxy163@126.com 回答时间:2015-3-14 13:34:46
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-14 13:35:07
提示: 作者被禁止或删除 内容自动屏蔽
w小菜才 回答时间:2015-3-14 14:17:28
谢谢分享
拼命三郎 回答时间:2015-3-14 17:24:59
xxxxxxxxxx.jpg
dear祝子 回答时间:2015-3-15 08:00:57
谢谢你分享你的经验
_ilikerome_ 回答时间:2015-3-15 08:53:15
谢谢分享啊  
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版