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

【安富莱STemWin教程】第53章 RADIO-单选按钮控件

[复制链接]
baiyongbin2009 发布时间:2015-3-11 11:58
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接6 x6 K8 j: e% x
第53章 RADIO-单选按钮控件

9 U6 I  c1 t  R+ K4 M5 L) Z0 A& C
    本期教程讲解STemWin支持的单选按钮控件。
    53. 1 单选按钮控件介绍
    53. 2 官方DIALOG_Radio实例
    53. 3 使用官方GUIBulder建立单选按钮控件
    53. 4 总结
+ K, A% Y4 M7 y1 G1 n0 ?
53.1 进度条控件介绍
   如同复选框一样,单选按钮也可用来选择选项。打开或选择单选按钮时,将出现圆点。与复选框的差别是,用户一次只能选择一个单选按钮。选择一个按钮时,控件中的其他按钮将关闭 (如右图所示)。一个单选按钮控件可能包含任意数量的按钮, 这些按钮始终处于垂直排列状态。下表显示的是RADIO按钮的默认外观:
53.1.png
设置皮肤后显示效果如下:
53.2.png
53.1.1 单选按钮支持的通知代码
    以下事件是单选按钮控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息
描述
WM_NOTIFICATION_CLICKED
已被点击。
WM_NOTIFICATION_RELEASED
已被释放。
WM_NOTIFICATION_MOVED_OUT
已被点击,且指针已移出控件,但没有释放。
WM_NOTIFICATION_VALUE_CHANGED
单选按钮的值 (内容)已更改。
53.1.2 单选按钮支持的键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反
按键
反应
GUI_KEY_RIGHT
选定范围增加1。
GUI_KEY_DOWN
选定范围增加1。
GUI_KEY_LEFT
选定范围减小1。
GUI_KEY_UP
选定范围减小1。
53.2 官方DIALOG_Radio实例
    官方的这个实例很好的演示了MULTIPAGE的使用,这个例子在模拟器中的位置:
53.3.png
源码如下(程序中进行了详细的注释):
  1. #include <stddef.h>) g0 g8 m$ u. x1 a3 W
  2. #include "GUI.h"! W) ]. r' \1 R0 q/ o
  3. #include "DIALOG.h"
    - A4 E% g" l* z* N$ |. V! R

  4. ( H# A/ p8 f0 f
  5. /*********************************************************************- F) t5 d+ `. B3 f* V- ?% N& I  I
  6. *2 @( y( N$ j& w9 P
  7. *       Dialog resource9 Q$ r0 V& T' ~( h6 Q- ~; _
  8. *    对话框资源表
    & e7 D8 J9 z1 B/ Z% Q  N
  9. */
    6 J+ O% L" _9 u" T
  10. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    7 D# s9 J, s) Q. w4 P
  11.   { FRAMEWIN_CreateIndirect, "Radio button sample", 0,        30,  70, 260, 100, FRAMEWIN_CF_MOVEABLE },
    ; u% h$ B0 T. t; `% c
  12.   { RADIO_CreateIndirect,     NULL,           GUI_ID_RADIO0,   5,  10,   0,   0,   0,  3 },
    ! i& E/ n/ ?1 |3 r# ]4 W
  13.   { TEXT_CreateIndirect,     "Suspend",       GUI_ID_TEXT0,   25,  10,  70,  20, TEXT_CF_LEFT },7 ~) k9 Y, L4 u3 J, j2 q1 a
  14.   { TEXT_CreateIndirect,     "Shut down",     GUI_ID_TEXT1,   25,  30,  70,  20, TEXT_CF_LEFT },  _* }$ M6 [" i( k' d3 f
  15.   { TEXT_CreateIndirect,     "Restart after", GUI_ID_TEXT2,   25,  50,  70,  20, TEXT_CF_LEFT },
    - i8 ~0 w0 U, o: j& G& `; m
  16.   { TEXT_CreateIndirect,     "seconds",       GUI_ID_TEXT3,  130,  50,  70,  20, TEXT_CF_LEFT },  L/ V6 c' ?5 {, b
  17.   { EDIT_CreateIndirect,     "200",           GUI_ID_EDIT0,   95,  47,  30,  19, 0, 3},1 U5 Y0 d% L$ p3 N( ~) V9 H
  18.   { BUTTON_CreateIndirect,   "OK",            GUI_ID_OK,     180,  10,  60,  20 },
    ( l& }+ K4 z0 G0 `( i
  19.   { BUTTON_CreateIndirect,   "Cancel",        GUI_ID_CANCEL, 180,  40,  60,  20 }( @$ Z( ^% I3 q/ C/ u0 m
  20. };5 D& ^  A" c+ s8 _
  21. ( E4 I9 d/ m' q! k  n

  22. 0 A' O+ k7 G7 F: r
  23. /*********************************************************************
    4 ^4 o, {% \  b: b, S( p, x  P1 F
  24. *
    . C8 P; i7 f7 A
  25. *       _cbBkWindow- y; \  \; E# a7 _
  26. *     桌面窗口的回调函数- B  C8 _7 w0 |; s* K1 m9 ^2 \. H
  27. */
    8 G/ q7 I9 |: z# _: b0 m
  28. static void _cbBkWindow(WM_MESSAGE* pMsg) {
    $ {5 I8 q# ]9 K+ g) o* V4 ~9 ]
  29.   switch (pMsg->MsgId) {
    $ ?; @+ K& s! B: `; M: t
  30.   case WM_PAINT:9 T7 j! g& h3 z( g9 X0 U
  31.     GUI_SetBkColor(GUI_RED);
    # s  N, [) l" x/ A; \$ D
  32.     GUI_Clear();/ m# P* j7 N' u6 `
  33.     GUI_SetColor(GUI_WHITE);$ C7 f. q) o' }8 e6 _7 j  t% O
  34.     GUI_SetFont(&GUI_Font24_ASCII);
    2 v- M2 S0 v8 J7 {" L
  35.     GUI_DispStringHCenterAt("DIALOG_Radio - Sample", 160, 5);3 u. o( ^1 D1 P% E
  36.     break;7 `6 O& i8 {; l1 t5 P" O. w
  37.   default:! Z8 F2 R; j# F
  38.     WM_DefaultProc(pMsg);0 s# i) j: W" c3 \6 t2 E
  39.   }" U1 y3 |' v8 [
  40. }
    % O0 T* m9 P$ W% j
  41. ) v# W; o& j( N) N4 o
  42. /*********************************************************************. {; D! Q  v9 \  n) J
  43. *, V1 G! v- I$ h4 C7 ?
  44. *       _cbCallback; `( d* I; l. ^, h( ~: l
  45. *     对话框的回调函数# A% K2 ]; U" b2 g" x0 u+ R; D
  46. *// [  q- v, e4 C9 G" X% ]
  47. static void _cbCallback(WM_MESSAGE * pMsg) {
    8 Z9 _3 X3 ^* _1 m) h
  48.   WM_HWIN hDlg;$ v# [, u. }: A0 |1 I
  49.   WM_HWIN hItem;+ I- a$ D0 o' k! g
  50.   int     Sel;
    ! P  F& @  q5 D. @
  51.   int     NCode;8 s2 A4 ^. {1 a) ?2 y
  52.   int     Id;
    + Z$ D$ b( P' A

  53. - K! v+ D) [. }. q, ^4 Y# J# V
  54.   GUI_PID_STATE * pState;
    ( ?- S$ A: P' ?+ y( _, h( n2 V& N
  55.   hDlg = pMsg->hWin;
    0 k2 z( M, V& w, `+ Y2 d: F# M7 x. E
  56.   switch (pMsg->MsgId) {8 w! `% J8 @! d3 l/ T" S" F
  57.     case WM_INIT_DIALOG:0 T8 u, V& A" a1 W, o1 x) ]: U
  58.       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
    ) h% _; |6 i4 T; |4 D& d; v
  59.       EDIT_SetDecMode(hItem, 30,   0, 999, 0, 0);    // 选项编辑框的10进制模式) G) f9 Q0 ^% k! O4 w
  60.       WM_DisableWindow(hItem);; s8 m3 T5 |& g  o4 K* _
  61.       break;. v% _$ h1 e3 q4 A9 ?
  62.     case WM_KEY:2 ?8 Q  o( Q* \; L7 A" P( X6 }/ T
  63.       switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {# F* ]8 M! {( F2 m7 h& m" F; T
  64.         case GUI_KEY_ESCAPE:
    * ~  q1 [: \6 r& R. i+ K
  65.           GUI_EndDialog(hDlg, 1);
    4 |3 @: `" T; d7 I  R
  66.           break;
    ; r, g. }. `! h# n$ d: j$ H( I
  67.         case GUI_KEY_ENTER:
    1 g, M6 h$ }2 Z9 H6 F$ e$ H
  68.           GUI_EndDialog(hDlg, 0);
    ' D' G2 K% {' M4 p2 g: M) m
  69.           break;
    & g* j3 D8 b- d6 u' B& n- F& r1 R* C
  70.       }+ b! t8 \' D2 O* }  ^4 V6 h" t
  71.       break;
    1 ?& R. \+ h, Y/ @/ ~- y: f# r
  72. /* 通过WM_TOUCH_CHILD消息的主要功能是:当点击单选按钮边上的文本控件时,
      `0 I  V5 c" `4 t
  73.    也可以实现单选按钮控件的选择
    ' A3 J- m- M9 m$ H' ~: r
  74.   */  
    3 X- n2 t/ |2 v5 d
  75.     case WM_TOUCH_CHILD:6 A' F9 ]0 v9 Z$ y, K
  76.       Id = WM_GetId(pMsg->hWinSrc);      
    3 q- |6 ^  s0 \/ r/ N
  77.       switch (Id) {
    : V7 G4 _" Z. F1 W9 Y* l
  78.         case GUI_ID_TEXT0:9 _7 Z/ d4 a  O8 X; A% {
  79.         case GUI_ID_TEXT1:
    8 R! N7 g7 r& |+ O: p8 M7 s$ j
  80.         case GUI_ID_TEXT2:
    1 u7 N- P( d" A7 q
  81.           pState = (GUI_PID_STATE *)((WM_MESSAGE *)pMsg->Data.p)->Data.p;6 `' F7 t" d. e8 [- ]- D* n
  82.           if (pState) {# E; H% I4 q: H
  83.             if (pState->Pressed) {
    # Z, S, K/ @( p: E- H: n) V- j
  84.               WM_HWIN hRadio = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);5 h5 E- B$ B6 a9 S# d
  85.               RADIO_SetValue(hRadio, Id - GUI_ID_TEXT0);   
    & m0 @4 [, v& q$ F8 T
  86.             }6 Y* J  n; X. i1 [3 x
  87.           }
    ( F. h" s' H5 }- K
  88.           break;0 n: g3 G( i  i& Y1 O! E6 u
  89.       }
    ' I# q0 U! J6 ^7 c- I
  90.       break;6 o  |: C3 `& A: X5 Y, ~4 `3 m
  91.     case WM_NOTIFY_PARENT:
    8 a  H& X: B$ Z& r) k
  92.       Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget! L: H$ q9 {) E2 v' q# K5 A
  93.       NCode = pMsg->Data.v;                 // Notification code
    ( u  Z) o! T6 M/ ?  I- i+ p
  94.       switch (NCode) {
    : I; Q" L$ o: p( X) U
  95.         case WM_NOTIFICATION_RELEASED:      // React only if released1 b8 D$ N0 S' b5 i" K+ B
  96.           switch (Id) {+ r7 V6 N, Z, B* E
  97.             case GUI_ID_OK:) Y, ~8 [* u- g
  98.               GUI_EndDialog(hDlg, 0);
    4 I0 F0 |) E$ S
  99.               break;: B  p) {* u7 B; M, ?1 s
  100.             case GUI_ID_CANCEL:
    . o; J" z, M; @' y( t
  101.               GUI_EndDialog(hDlg, 1);
    - S* n8 [" c1 M) U
  102.               break;  ?5 K% J8 `1 X
  103.           }; f, f3 |. K3 D0 O) u3 M  u
  104.           break;
    * x2 _! O$ E* h# u3 z$ D2 |
  105. /* 当选择第三个单选按钮时,将使能编辑框GUI_ID_EDIT0 */
    5 w; h: |7 s9 H) a9 }4 g+ G
  106.         case WM_NOTIFICATION_VALUE_CHANGED:8 W8 }+ Z2 l. T9 q3 ~
  107.           hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);( h; U: E& i' b% `8 J# I
  108.           Sel   = RADIO_GetValue(hItem);1 @' S$ X+ |+ D
  109.           hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);: A- ~1 Z' P1 _; _5 o. s5 c7 k" C
  110.           WM_SetEnableState(hItem, Sel == 2);      
    $ A, X4 v* w8 @7 T9 X/ A, g  N
  111.           break;
    - E0 ?1 a8 D5 \. k) A5 F
  112.       }
    ' f$ l" t0 x- d3 B3 S
  113.       break;" H) [  ~4 |8 I) J/ c
  114.     default:! ^- M) b! {1 a- [4 ^
  115.       WM_DefaultProc(pMsg);+ ]$ t6 J; G2 E
  116.   }
    " l  T. v6 R) {8 i. B% N, p9 i4 y
  117. }) \5 N3 g( w; y  o9 o( z- [- D
  118. 0 ]$ w* x+ f/ e- j9 W
  119. /********************************************************************** m  ]6 |9 C" K: q: L: x4 e2 V
  120. *
    . o" _+ I7 \. F: {$ W% V& b/ D% ~
  121. *       MainTask
    . ^9 s5 s4 B5 x
  122. */
    * M  `+ w% C  _* z
  123. void MainTask(void) {
    3 C$ E. ^) o) m  ~$ ]
  124.   GUI_Init();4 r1 k0 x) r2 S
  125.   WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
    2 j4 i. }6 z" Z
  126.   WM_SetCreateFlags(WM_CF_MEMDEV);  // Use memory devices on all windows to avoid flicker+ c$ B4 F' p" e
  127.   while (1) {0 ]  {& w6 F0 |3 D8 k6 Z
  128. /* 创建阻塞式对话框 */3 ~0 e2 F8 n  d  M
  129.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    5 F/ t3 l" q! o# H' }; y1 J
  130.     GUI_Delay(1000);8 l1 F' I3 F6 }9 ~8 `6 t+ `5 a
  131.   }. m; ?4 y* q% Z, k6 `0 x: p$ u
  132. }
复制代码
实际现象效果如下:
53.4.png
53.3 使用官方GUIBulder建立单选按钮控件
    这里用GUIBulder5.22建立一个如下的界面(分辨率480*272):
53.5.png
鼠标放在单选按钮控件上面右击可以设置单选按钮:
53.6.png
具体每个选项的名字在右下角进行设置:
53.7.png
将生成的代码直接复制到模拟器或者开发板上面运行,实际显示效果如下(生成的代码在本期教程配套的例子中):
53.8.png
53.4 总结
    本期教程主要是跟大家讲解了单选按钮控件的基础知识。希望大家可以把本期教程中讲的这两个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的单选按钮控件API,其它的API大家都可以试试。
* j/ y( s3 E8 W8 t: ~1 ~1 x; f$ W
赞 收藏 评论3 发布时间:2015-3-11 11:58

举报

3个回答
netlhx 回答时间:2015-3-11 12:05:04
都是好东西…
zhangdaijin 回答时间:2015-3-11 12:47:03
支持一下
mark0668 回答时间:2015-3-11 13:15:01
大力支持!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版