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

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

[复制链接]
baiyongbin2009 发布时间:2015-3-11 11:58
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接& i) X' i: T! }7 d9 a. l  D$ c; f
第53章 RADIO-单选按钮控件

4 K; _( }! y6 ]- G
    本期教程讲解STemWin支持的单选按钮控件。
    53. 1 单选按钮控件介绍
    53. 2 官方DIALOG_Radio实例
    53. 3 使用官方GUIBulder建立单选按钮控件
    53. 4 总结

8 t1 ?, O# n3 p2 ~$ D53.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>5 q! f5 Y, e$ L" V1 s* n
  2. #include "GUI.h"9 Q7 x8 H3 `7 m9 j
  3. #include "DIALOG.h"
      ?3 K+ A, v! E- i( ~

  4. 6 G5 v7 @0 b- ^- f+ x& N7 i" ^6 b. b
  5. /*********************************************************************
    - r7 a- l1 O; ^/ B9 F
  6. *5 i7 z6 T+ F2 g! ~4 ?0 ^
  7. *       Dialog resource' s6 D' I# \( q9 y7 k( n% F! o
  8. *    对话框资源表
    3 a; f, {- g; C  b
  9. */
    " G% E; u  ~) n9 o
  10. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    1 N; ]6 R" T8 B( P6 X3 d
  11.   { FRAMEWIN_CreateIndirect, "Radio button sample", 0,        30,  70, 260, 100, FRAMEWIN_CF_MOVEABLE },
    : e9 [  s1 J) F; X
  12.   { RADIO_CreateIndirect,     NULL,           GUI_ID_RADIO0,   5,  10,   0,   0,   0,  3 },! ~5 R" a. s& t% a% g5 i
  13.   { TEXT_CreateIndirect,     "Suspend",       GUI_ID_TEXT0,   25,  10,  70,  20, TEXT_CF_LEFT },
    # h. w; K2 n$ w) v. p- D0 A
  14.   { TEXT_CreateIndirect,     "Shut down",     GUI_ID_TEXT1,   25,  30,  70,  20, TEXT_CF_LEFT },3 P- Y0 \" q* ~+ v. s
  15.   { TEXT_CreateIndirect,     "Restart after", GUI_ID_TEXT2,   25,  50,  70,  20, TEXT_CF_LEFT },
    & D9 y  Q! E8 t$ J
  16.   { TEXT_CreateIndirect,     "seconds",       GUI_ID_TEXT3,  130,  50,  70,  20, TEXT_CF_LEFT },
    ) p! j' N4 V# o/ S" U" ~$ f* @
  17.   { EDIT_CreateIndirect,     "200",           GUI_ID_EDIT0,   95,  47,  30,  19, 0, 3},
    / y# K. b# W0 D
  18.   { BUTTON_CreateIndirect,   "OK",            GUI_ID_OK,     180,  10,  60,  20 },
    : D9 z% Z; X3 k5 k/ l" U
  19.   { BUTTON_CreateIndirect,   "Cancel",        GUI_ID_CANCEL, 180,  40,  60,  20 }
    / X4 l  u; ^* \8 r1 Q0 ]0 p
  20. };
    9 d  h8 o' K7 M; N

  21. . G4 k4 |1 I* D7 p5 }, R

  22. 4 x) T" B8 \) `; d* O, T
  23. /*********************************************************************9 {4 A6 N9 p- W) L1 K% L: x
  24. *
    , {/ e0 ]1 Q/ @$ t$ A+ {7 G
  25. *       _cbBkWindow
    $ w# `( S; p& n. K6 I3 d. t
  26. *     桌面窗口的回调函数
    ( k% \. w" ]1 v/ ^* S  L
  27. */
    : M4 @' j/ ?# [% _" {2 s6 s/ X
  28. static void _cbBkWindow(WM_MESSAGE* pMsg) {6 ^0 M) Q7 ]1 ?8 `3 r+ D( [$ t
  29.   switch (pMsg->MsgId) {
    + h$ K8 B+ c; g& A* t: X
  30.   case WM_PAINT:) e( k9 k( e/ U/ E
  31.     GUI_SetBkColor(GUI_RED);9 Z! f8 G/ L2 k- r' ^
  32.     GUI_Clear();3 O0 K* Q% H0 W6 F1 ?
  33.     GUI_SetColor(GUI_WHITE);
    " `5 k: E0 C0 F
  34.     GUI_SetFont(&GUI_Font24_ASCII);. m# a% A) y) P2 I
  35.     GUI_DispStringHCenterAt("DIALOG_Radio - Sample", 160, 5);
    - A$ Z8 u- D- y5 b! J
  36.     break;- t' P1 J  ~+ s% S1 i4 {
  37.   default:0 g8 F, E, l# G# F( ?
  38.     WM_DefaultProc(pMsg);, y( r9 u* r5 C3 L6 n% d6 r$ h
  39.   }
    ! o( A6 ~9 N& J
  40. }# ?5 {" Y. r) D; Z$ M4 A: ~
  41. 0 `( Y0 j; i6 j- ^  \; }& x+ F' m
  42. /*********************************************************************/ \- ]6 N! a2 t2 u$ k; `
  43. *! o- r) l1 `/ ~7 K
  44. *       _cbCallback, s( ]& b1 L) H
  45. *     对话框的回调函数
    ' j4 e* d+ ~) C. l: h. r
  46. */
    $ U$ z# F8 b, o
  47. static void _cbCallback(WM_MESSAGE * pMsg) {+ [$ v! ~# s. o, Z
  48.   WM_HWIN hDlg;
    ! s+ u$ l, A0 H
  49.   WM_HWIN hItem;) i5 o7 `6 a8 S* O7 I" m& f
  50.   int     Sel;( |( w: Z5 X) }  t; q# {4 f
  51.   int     NCode;4 w, V' N8 w; }2 X
  52.   int     Id;' c' `$ E7 W0 m3 [- b; }

  53. ( S; O( v. S4 ~! p. s
  54.   GUI_PID_STATE * pState;+ P0 U; G4 T0 ^: _6 B
  55.   hDlg = pMsg->hWin;
    8 n3 ?# R" n9 \
  56.   switch (pMsg->MsgId) {
    3 ?3 y6 l9 j. b# L( M4 A, T3 s
  57.     case WM_INIT_DIALOG:
    ( C5 n+ t: i% A
  58.       hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);6 ~, W: X* I) s. ~
  59.       EDIT_SetDecMode(hItem, 30,   0, 999, 0, 0);    // 选项编辑框的10进制模式/ V% n* t2 k5 E: j
  60.       WM_DisableWindow(hItem);
    : ]" f% _* z6 Y0 F* ~5 |
  61.       break;# q, g! i! h' v0 W0 p) G
  62.     case WM_KEY:
    ! r  c; i! G) u; A+ T
  63.       switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
    5 W/ Q2 f0 _0 @5 N7 z. t
  64.         case GUI_KEY_ESCAPE:' M" V; J( l% U% i0 V' \3 N
  65.           GUI_EndDialog(hDlg, 1);
    3 b% R) j! A+ O. l
  66.           break;* T; C6 S: [: B
  67.         case GUI_KEY_ENTER:
    9 A) s6 n4 ^: i( o! i3 g+ n7 n
  68.           GUI_EndDialog(hDlg, 0);
    ) q) G  _' M0 P2 I2 Q! i& o
  69.           break;1 Q9 R1 P. u1 m! j5 e
  70.       }
    ( n7 O& @3 s% [9 e  w% `
  71.       break;" [8 F6 d0 I* D3 W9 B
  72. /* 通过WM_TOUCH_CHILD消息的主要功能是:当点击单选按钮边上的文本控件时,
    9 X" E1 \1 w& N+ C
  73.    也可以实现单选按钮控件的选择
    $ Z  X# e. W- c& ?  b
  74.   */  # v: {# z2 ?7 `" n
  75.     case WM_TOUCH_CHILD:
    ! g( G" `$ f) X' ^9 k4 R8 Z1 h
  76.       Id = WM_GetId(pMsg->hWinSrc);      - t' S( y- p# T4 M/ U
  77.       switch (Id) {. Y: {( K( g2 S7 p
  78.         case GUI_ID_TEXT0:
    $ m( I- ?, Z1 v0 s7 b, q/ y
  79.         case GUI_ID_TEXT1:& x; c2 R  l. X* D4 A5 u  V
  80.         case GUI_ID_TEXT2:
    9 G4 R9 g+ w1 g! y8 }
  81.           pState = (GUI_PID_STATE *)((WM_MESSAGE *)pMsg->Data.p)->Data.p;3 g1 x( k9 y5 A" `+ z+ h
  82.           if (pState) {
    + b$ b1 l. q/ P' Q( z9 o
  83.             if (pState->Pressed) {7 }% Y/ _3 V' C: Y+ y3 W
  84.               WM_HWIN hRadio = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);
    9 }3 P* J$ Y! m3 S9 r- g) S& m
  85.               RADIO_SetValue(hRadio, Id - GUI_ID_TEXT0);   4 X- F& g8 q  S
  86.             }2 u7 t& ~9 z5 m% ]" X7 {
  87.           }
    % ^1 `8 P, r4 M/ ?: q/ b$ _; g! y8 o
  88.           break;/ B1 ]; w8 H) A* E6 w9 `  B
  89.       }) o/ K( Q+ C) v3 O8 Y3 m$ j
  90.       break;* o( N0 k) _1 `( \: E
  91.     case WM_NOTIFY_PARENT:
    . A8 |- l! ]/ @& l# V
  92.       Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
    7 j6 j2 D, g# `3 j, ^
  93.       NCode = pMsg->Data.v;                 // Notification code# P" S- \0 [  x: \
  94.       switch (NCode) {3 q" S, H- l& F& U3 l- Y
  95.         case WM_NOTIFICATION_RELEASED:      // React only if released# Z. I0 a3 O9 p( F/ ?9 Z3 e+ M
  96.           switch (Id) {" B/ ~5 N5 K- O8 ~" E; Y
  97.             case GUI_ID_OK:7 o+ X& O9 E2 ~4 h' R/ V/ c3 f# t
  98.               GUI_EndDialog(hDlg, 0);7 I5 M, {' E' p( h% K
  99.               break;
    * K9 Q9 [4 Z( U" a
  100.             case GUI_ID_CANCEL:) H4 E( {+ C% N4 ^: D2 T
  101.               GUI_EndDialog(hDlg, 1);
    2 d; o/ E$ w6 ?3 ?. D, Q+ I8 w
  102.               break;
    5 k* y) E$ a8 D. m( k' ]
  103.           }
    / C# E% F3 z5 d
  104.           break;$ E. E7 ]% \4 y
  105. /* 当选择第三个单选按钮时,将使能编辑框GUI_ID_EDIT0 */8 q9 o! ^9 i6 D' t  Q
  106.         case WM_NOTIFICATION_VALUE_CHANGED:
      G6 |% @* w( V' q
  107.           hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);2 ?0 q7 g2 R+ f: v
  108.           Sel   = RADIO_GetValue(hItem);
    ( l* T% w% |1 [7 A
  109.           hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
    # X- d+ w! V) y- O
  110.           WM_SetEnableState(hItem, Sel == 2);      
    3 u! y* s1 H5 H* w# j
  111.           break;
    8 y0 ]0 H" B0 B  U
  112.       }5 `: B7 e- W. o  u3 m' |
  113.       break;
    8 G# Z/ }& g( q& o
  114.     default:, E# {; C# x: b, B
  115.       WM_DefaultProc(pMsg);# e& g6 P1 \' b6 ?0 j) m8 g8 h
  116.   }/ T$ x+ \5 p) q7 X; f, e; k9 f
  117. }( Y4 b* s7 W' G4 [, f5 ^. j  [

  118. # U* J! U7 L# h* W* H/ K' G0 c- t; U
  119. /*********************************************************************
    0 L! Z6 ]% \9 V6 ]' a8 B
  120. *
    0 O3 [, F1 @6 t1 v
  121. *       MainTask& t5 @9 a* P9 `" a9 g: c8 `
  122. */
    1 N9 H8 b; I$ p# h- |5 i6 m0 [8 r
  123. void MainTask(void) {( y  f4 G  S  R
  124.   GUI_Init();
    & t, T0 W& [6 \/ [
  125.   WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
    3 r" Y+ p# G/ A& ^' j9 T# }: p
  126.   WM_SetCreateFlags(WM_CF_MEMDEV);  // Use memory devices on all windows to avoid flicker+ m! I6 P6 N0 F' |
  127.   while (1) {
    " v2 o# x; Z/ i/ p: ?5 r
  128. /* 创建阻塞式对话框 */
    * q( M: O* b- x' ]
  129.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    ' E# T+ z( d8 l$ I
  130.     GUI_Delay(1000);
    ; u8 p0 a2 o8 o4 l8 X
  131.   }* ^4 l7 G7 _8 B$ l5 I
  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大家都可以试试。
) }; E/ e: ?! j7 c: R( e2 N  @
收藏 评论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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版